如何在cmake中将第三方库链接到静态库目标
How to link a 3rd party lib to a static library target in cmake?
我想创建一个这样的项目:
Foo/
|- libFoo/
|- CMakeLists.txt
|- foo.h
|- foo.cpp
|- libFooTests/
|- CMakeLists.txt
|- test.cpp
|- CMakeLists.txt
# Foo/CMakeLists.txt
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
PROJECT(Foo)
# I'm on windows, so make sure that all projects are using same runtime library
SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd"
SET(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT"
ADD_SUBDIRECTORY(libFoo)
ADD_SUBDIRECTORY(libFooTests)
# Foo/libFoo/CMakeLists.txt
ADD_LIBRARY(libFoo foo.h foo.cpp)
LINK_DIRECTORIES(${THIRD_PARTY_LIB_DIR})
TARGET_LINK_LIBRARIES(libFoo lib3rdparty)
# Foo/libFooTests/CMakeLists.txt
ADD_EXECUTABLE(libFooTests test.cpp)
INCLUDE_DIRECTORIES("${PROJECT_SOURCE_DIR}/libFoo")
TARGET_LINK_LIBRARIES(libFooTests libFoo)
如果我在这个设置上运行cmake,项目就可以成功生成。但它未能构建,因为生成的项目被配置为将lib3rdparty
链接到测试目标libFooTests
而不是libFoo
,当然libFooTests
不知道(也不应该知道)在哪里可以找到lib3rdparty
。
我在windows上(使用生成器"Visual Studio 12 2013 Win64")和Ubuntu上(使用生成程序"Unix Makefiles")都尝试过这一点。
我所期望的:
${THIRD_PARTY_LIB_DIR}
应配置为指向libFoo
目标的库搜索路径,lib3rdparty
应配置为libFoo
的库输入libFooTests
只知道在哪里包括libFoo
(又称${PROJECT_SOURCE_DIR}/libFoo
)和链路libFoo
的报头。它应该对lib3rdparty
一无所知
发生了什么:
CCD_ 15似乎被忽略了。lib3rdparty
是libTests
的库输入
我注意到:
我注意到visual studio中libFoo.vcxproj
和libFooTests.vcxproj
的Properties Page
对话框略有不同。
前者具有Configuration Properties | Librarian
条目,而后者具有Configuration Properties | Linker
条目。
如何仅将lib3rdparty
链接到libFoo
?
你不能。
静态库不会被链接。静态库只是一堆被打包成一个文件的对象文件。
当你将它们与一个完整的程序链接时,就会发生链接。因此,如果您的静态库依赖于另一个库,则必须将该库链接到使用静态库的所有程序中。CMake在这里似乎自动地做了正确的事情。
- 如果我想链接静态库并删除未使用的符号.txt我应该如何处理 Cmakelist
- 为什么当我在 C 程序中链接静态库时会"undefined symbol"?
- 强制链接静态库与 cmake 不起作用
- CMake 项目链接静态库
- 使用 CMake 在 Mac 上链接静态 GLFW 和 OpenGL
- DLL 链接静态库 - 未使用函数中未解析的链接器符号
- 如何使用 WAF 链接静态库?
- 无法在 Mac OS X 上链接静态资源库
- MAPI 链接静态库 (LNK2019: 未解析的外部符号)
- 为什么G 不链接静态程序
- 节点本机模块 - 链接静态库
- 在链接链接静态(GSOAP)库的共享库时,为什么会得到一个未定义的符号
- 链接静态和动态库时违反 ODR
- 代码中的MinGW::块不链接静态OpenSSL库
- Emscripten 链接静态库错误:wasm 流式编译失败:导入'env.getTempRet0'
- 如何正确链接静态类
- CMake 链接静态库和 glib 错误
- Eclipse CDT:如何在没有项目清理>>项目重建的情况下重新链接静态库
- 错误:链接静态库时出现";"
- gcc 如何链接静态库