以Boost为例,当C没有稳定的ABI时,为什么我能够从C程序中链接到boost::filesystem
。
我的系统中安装了Boost,一个玩具程序能够使用-lboost_filesystem
进行链接,即使boost::filesystem
公开了一个C++ API(没有外部的“C”)。
那么,有没有可能创建C++共享库,可以通过各种编译器版本链接?Boost如何在没有“extern C”的情况下实现这一点?
我试探着:
#include <iostream>
#include <boost/filesystem.hpp>
namespace fs = boost::filesystem;
int main() {
// Replace "/path/to/directory" with the path to the directory you want to list
std::string directory_path = "/path/to/directory";
try {
// Check if the given path exists and is a directory
if (fs::exists(directory_path) && fs::is_directory(directory_path)) {
std::cout << "Listing files in directory: " << directory_path << std::endl;
// Iterate through the files in the directory
for (const auto& entry : fs::directory_iterator(directory_path)) {
std::cout << entry.path() << std::endl;
}
} else {
std::cerr << "Error: Invalid directory path." << std::endl;
return 1;
}
} catch (const fs::filesystem_error& ex) {
std::cerr << "Error: " << ex.what() << std::endl;
return 1;
}
return 0;
}
字符串g++ -o fs fs.cpp -I/usr/include/boost -I/usr/include/boost/filesystem -I/usr/include/boost/system -lboost_system -lboost_filesystem -std=c++14
个
期望值:应该得到链接错误,因为C++没有稳定的ABI
Got:编译成功。
1条答案
按热度按时间7y4bm7vi1#
我不确定ABI本身,但是将一个编译器构建的C库与另一个编译器编译的程序链接起来的真实的关键在于两个编译器共享相同的名称mangling schema。
事实上,g和clang++的工作方式是一样的,并且多年来一直使用相同的模式。
但是正如这个question and answer所揭示的那样,试图通过在Windows上用MinGW编译一个库并期望它与Visual Studio链接来做类似的事情是行不通的。这是不可能的,除非近年来发生了变化。