如何根据cmake中的配置类型更改库加载*路径*?

时间:2012-01-14 06:28:57

标签: c++ windows visual-c++ cmake static-libraries

我有一个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})

我怎么能做到这样的事呢?

1 个答案:

答案 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

所以,总而言之:

  1. 在项目内部构建自己的库时,请使用输出属性OUTPUT_NAME和各种ARCHIVE_RUNTIME_LIBRARY_输出所有具有每个配置变体的属性。

  2. 链接到第三方库时,请使用IMPORTED_LOCATION特别重要的导入属性及其每个配置的变体。