Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何将第三方库链接到cmake中的静态库目标?_C++_Visual Studio_Cmake_Linker - Fatal编程技术网

C++ 如何将第三方库链接到cmake中的静态库目标?

C++ 如何将第三方库链接到cmake中的静态库目标?,c++,visual-studio,cmake,linker,C++,Visual Studio,Cmake,Linker,我想做一个这样的项目: Foo/ |- libFoo/ |- CMakeLists.txt |- foo.h |- foo.cpp |- libFooTests/ |- CMakeLists.txt |- test.cpp |- CMakeLists.txt # Foo/CMakeLists.txt CMAKE_MINIMUM_REQUIRED(VER

我想做一个这样的项目:

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(使用generator“Visual Studio 12 2013 Win64”)和Ubuntu(使用generator“Unix Makefiles”)上都试过了

我所期望的是:
${THIRD_PARTY_LIB_DIR}
应配置为指向
libFoo
目标的库搜索路径,
lib3rdparty
应配置为
libFoo
libFooTests
只知道在哪里包括
libFoo
(又名
${PROJECT\u SOURCE\u DIR}/libFoo
)的标题和链接
libFoo
。它不应该知道任何关于
lib3rdparty

发生了什么事
${THIRD\u PARTY\u LIB\u DIR}
似乎被忽略了。
lib3rdparty
是用于
libTests

我注意到: 我注意到visual studio中的
libFoo.vcxproj
libFooTests.vcxproj
Properties页
对话框略有不同

前者有一个
configurationproperties | library
条目,而后者则有一个
configurationproperties | Linker
条目

我如何才能仅将
lib3rdparty
链接到
libFoo

静态库不会被链接。静态库只是一组打包成一个文件的对象文件


链接发生在您将它们与完整程序链接时。因此,如果静态库依赖于另一个库,则必须将该库链接到使用静态库的所有程序中。CMake通过自动执行此操作似乎在做正确的事情。

我明白了。有什么方法可以实现类似的目标吗?使
libFoo
共享等。鉴于“静态lib不会被链接”,这里最合适的方法可能是让
libfootest
知道从
libFoo
中“继承”这些lib的位置。将
LINK_目录
放入
libFooTests/CMakeLists.txt将起作用,但这样做真的很麻烦。如何使
LINK_目录
也“继承”到
libFooTests