我有一个CMake项目,我想在不必手动覆盖的情况下链接正确的库(调试版本获取调试库;发布版本获取版本库)。 (例如,一旦msbuild位由CMake构建,我想要所有四个目标(调试,发布等)CMake生成能够构建而无需再次运行CMake)
CMake文档(和other things I've found about this)有以下几点:
SET(LINK_LIBRARY optimized Foo debug Foo_d)
target_link_libraries(MyEXE ${LINK_LIBRARY})
但是,这会更改基于文件名链接的库。让我们说,例如,我使用的是CMake(FindGTest.cmake等)中包含的Google Test位,而Google Test发行版看起来像这样:
Directory of C:\Foo\gtest-1.6.0\lib
12/30/2011 03:08 PM <DIR> Debug
12/30/2011 03:08 PM <DIR> Release
Directory of C:\Foo\gtest-1.6.0\lib\Debug
12/30/2011 03:08 PM 3,388,036 gtest.lib
12/30/2011 03:08 PM 602,112 gtest.pdb
12/30/2011 03:08 PM 131,528 gtest_main.lib
12/30/2011 03:08 PM 389,120 gtest_main.pdb
Directory of C:\Foo\gtest-1.6.0\lib\Release
12/30/2011 03:08 PM 2,701,324 gtest.lib
12/30/2011 03:08 PM 552,960 gtest.pdb
12/30/2011 03:08 PM 126,364 gtest_main.lib
12/30/2011 03:08 PM 372,736 gtest_main.pdb
CMake文档中提供的示例不再有效;该库的调试版和发行版具有相同的名称。因此,CMake文档中提供的示例不起作用 - 名称没有区别,这就是在那里指定库的方式。我不想在依赖库的构建树(Google Test)中重命名这些,因为这会添加额外的步骤来获得有效的构建。我希望有人能够下载Google Test,构建它,下载我的位,将环境变量CMAKE_LIBRARY_PATH设置为指向Google Test,并成功构建我的库。
作为参考,我当前的CMakeLists.txt
看起来像是:
project( Utilities )
cmake_minimum_required( VERSION 2.8.0 )
file( GLOB Utilities_SourceFiles "src/*.cpp" "src/*.rc" "include/utilities/*.h" )
file( GLOB Utilities_TestFiles "test/*.cpp" "test/*.rc" )
find_package( GTest REQUIRED )
include_directories( "include/" ${GTEST_INCLUDE_DIRS}))
cxx_library ( utilities ${Utilities_SourceFiles} )
cxx_executable ( test ${Utilities_TestFiles} )
target_link_libraries( test ${GTEST_BOTH_LIBRARIES} )
enable_testing()
GTEST_ADD_TESTS(Test.exe "" ${Utilities_TestFiles})
我怎么能做到这样的事呢?
答案 0 :(得分:1)
对于VisualStudio,请考虑一次设置多个配置,并使用不同的每个配置target properties。另请查看我对this question的回答,该回答演示了如何根据当前使用的配置设置输出名称。
此外:为Googletest设置一个新的/良好的find-package脚本,并使用add_library的IMPORTED选项。有了它,您可以定义单个库目标Foo
,并且可以为每个配置设置其属性(位置,文件名等):
# Assuming the Foo-root dir is defined in FOO_DIR
add_library( Foo IMPORTED )
# You can define two import-locations: one for debug and one for release.
set_target_properties( Foo PROPERTIES IMPORTED_LOCATION_DEBUG ${FOO_DIR}/Debug/Foo_d.lib
set_target_properties( Foo PROPERTIES IMPORTED_LOCATION_RELEASE ${FOO_DIR}/Release/Foo.lib
所以,总而言之:
在项目内部构建自己的库时,请使用输出属性OUTPUT_NAME和各种ARCHIVE_,RUNTIME_,LIBRARY_输出所有具有每个配置变体的属性。
链接到第三方库时,请使用IMPORTED_LOCATION特别重要的导入属性及其每个配置的变体。