且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

与Boost Filesystem的静态链接不起作用

更新时间:2023-11-11 23:28:28

您似乎对Boost使用了旧的CMake变量.从Boost 1.70开始,Boost现在提供CMake支持,使CMake可以更轻松地为您的项目查找和使用Boost(请参阅

You seem to be using the old CMake variables for Boost. As of Boost 1.70, Boost now provides CMake support to make it easier for CMake to find and use Boost for your project (see documentation on this page).

构建Boost时,您将看到每个Boost库的CMake软件包配置文件(通常与构建的库一起放置在 cmake 文件夹中).您可以在 CONFIG 模式下使用 find_package()查找这些程序包配置文件.这些提供了导入的目标,例如 Boost :: filesystem ,您可以直接链接到这些目标.这样,如果缺少 filesystem 库,则在编译/链接失败时,您不必浏览 BOOST_LIBRARIES 变量中的库列表.取而代之的是,CMake会告诉您在CMake配置时缺少该库.

When you build Boost, you will see CMake package configuration files for each Boost library (typically placed along with the built libraries in a cmake folder). You can use find_package() in CONFIG mode to find these package configuration files. These provide imported targets such as Boost::filesystem that you can link to directly. This way, if the filesystem library is missing, you don't have to sift through the list of libraries in the BOOST_LIBRARIES variable when compilation/linking fails. Instead, CMake will tell you the library is missing at the CMake configure-time.

此外,Boost库依赖关系现在应该自动解决.因此,如果您使用的是文件系统,则不再需要显式调用 system 库.Boost应该为您解决此依赖性.通过这些更改,您的 find_package()命令用法可能如下所示:

Also, the Boost library dependencies should now be resolved automatically. So, if you're using filesystem, you should no longer have to explicitly call out the system library also. Boost should resolve this dependency for you. With these changes, your find_package() command usage could look like this:

find_package(Boost CONFIG REQUIRED filesystem)
if(Boost_FOUND)
    add_executable(${PROJECT_NAME} "execute_code.cpp") 
    target_link_libraries(executable PRIVATE Boost::filesystem)
endif()


对于它的价值,您可以运行 make VERBOSE = 1 以查看链接阶段的详细输出,以 verify 链接所有正确的库.您应该能够看到Boost的 filesystem system 库已链接,并且可以验证它们是否为所需的静态( .a )库.


For what it's worth, you can run make VERBOSE=1 to see the verbose output at the link stage to verify that all the correct libraries are being linked. You should be able to see that Boost's filesystem and system libraries are linked, and you can verify they are the desired static (.a) libraries.