将"xxx.a"文件和目标传递给 target_link_libraries() 有什么区别?



当我将目标传递给target_link_libraries()时,它工作得很好。但是当我传递一个。a文件时("工作得很好")生成),它在编译时运行良好,但在链接时产生许多错误。

我有一个项目,cmakeffiles .txt是这样的:

file (sources a.cc b.cc ...)
add_executable(my_project ${sources}) 

现在我想使用相同的源文件生成一个静态库来支持另一个项目。所以cmakeffiles。txt是这样的:

file (sources a.cc b.cc ...)
add_library(my_project ${sources})
add_executable(another_project main.cc)
target_link_libraries(another_project my_project)

可以正常工作,但是当我尝试像这样直接链接一个文件时

target_link_libraries(another_project libmy_project.a)

它产生了许多"未定义的引用"。或"多重定义"到";链接目标时出错。

那么,当将目标传递给"target_link_libraries"时,究竟发生了什么?

首先,如果您将目标链接到一个文件,您应该首先确保在链接发生之前该文件存在,因此您应该在可执行文件和库目标之间添加目标依赖关系(假设两者都是同一个CMake项目的一部分)

add_dependencies(another_project my_project)
第二,如果您链接到任意文件(不是任何系统库),您应该提供完整路径到文件:
target_link_libraries(another_project ${CMAKE_CURRENT_BINARY_DIR}/libmy_project.a)

或者将库所在的文件夹添加到当前库搜索目录列表中:

link_directories(${CMAKE_CURRENT_BINARY_DIR})
target_link_libraries(another_project libmy_project.a)

那么当将目标传递给"target_link_libraries"时究竟发生了什么?

简单地说,当CMake以libName.a的形式命中对库的引用时,它只是添加-lName标志,并让链接器定位库本身。然后链接器失败,因为它只在LIBRARY_PATH路径下查找相应的存档。

最新更新