Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.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++_Windows_Visual C++_Cmake_Static Libraries - Fatal编程技术网

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

C++ 如何根据cmake中的配置类型更改库加载*路径*?,c++,windows,visual-c++,cmake,static-libraries,C++,Windows,Visual C++,Cmake,Static Libraries,我有一个CMake项目,我想在其中链接正确的库(调试构建获取调试库;发布构建获取发布库),而不必手动重写。(例如,一旦CMake构建了msbuild位,我希望CMake生成的所有四个目标(调试、发布等)都能够在不再次运行CMake的情况下进行构建) CMake文档(和)包含以下内容: SET(链接库优化的Foo调试Foo\d) 目标链接库(MyEXE${link\u LIBRARY}) 但是,这会更改基于文件名链接的库。比如说,为了举例,我使用了CMake中包含的Google测试位(FindG

我有一个CMake项目,我想在其中链接正确的库(调试构建获取调试库;发布构建获取发布库),而不必手动重写。(例如,一旦CMake构建了msbuild位,我希望CMake生成的所有四个目标(调试、发布等)都能够在不再次运行CMake的情况下进行构建)

CMake文档(和)包含以下内容:

SET(链接库优化的Foo调试Foo\d)
目标链接库(MyEXE${link\u LIBRARY})
但是,这会更改基于文件名链接的库。比如说,为了举例,我使用了CMake中包含的Google测试位(FindGTest.CMake等),Google测试发行版如下所示:

C:\Foo\gtest-1.6.0\lib的
目录
2011年12月30日03:08下午调试
2011年12月30日03:08下午发布
C:\Foo\gtest-1.6.0\lib\Debug目录
2011年12月30日03:08 PM 3388036 gtest.lib
2011年12月30日03:08 PM 602112 gtest.pdb
2011年12月30日03:08 PM 131528 gtest_main.lib
2011年12月30日03:08 PM 389120 gtest_main.pdb
C:\Foo\gtest-1.6.0\lib\Release目录
2011年12月30日03:08 PM 2701324 gtest.lib
2011年12月30日03:08 PM 552960 gtest.pdb
2011年12月30日03:08 PM 126364 gtest_main.lib
2011年12月30日03:08 PM 372736 gtest_main.pdb
CMake文档中提供的示例不再有效;库的调试版本和发布版本具有相同的名称。因此,CMake文档中提供的示例不起作用——名称没有区别,这就是在那里指定库的方式。我不想在依赖库的构建树(GoogleTest)中重命名它们,因为这将添加额外的步骤来获得一个工作的构建。我希望有人能够下载Google测试,构建它,下载我的bits,将环境变量CMAKE_LIBRARY_PATH设置为指向Google测试,并成功构建我的库

作为参考,我当前的
CMakeLists.txt
看起来像:

项目(实用程序)
cmake_最低要求(2.8.0版)
文件(GLOB Utilities_SourceFiles“src/*.cpp”“src/*.rc”“include/Utilities/*.h”)
文件(GLOB Utilities_TestFiles“test/*.cpp”“test/*.rc”)
查找包(需要GTest)
include_目录(“include/”${GTEST_include_DIRS}))
cxx_库(实用程序${utilities_SourceFiles})
cxx_可执行文件(test${Utilities_TestFiles})
目标链接库(测试${GTEST\u两个库})
启用_测试()
GTEST_添加_测试(Test.exe“${Utilities_TestFiles})

<>我如何实现这样的事情?

对于VisualStudio,考虑同时设置多个配置,并使用不同的每个配置。另请看我的答案,其中演示了如何根据当前使用的配置设置输出名称

另外:为Googletest设置一个新的/好的查找包脚本,并使用导入的选项。使用它,您可以定义单个库目标
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
总而言之:

  • 在构建项目内部的自己的库时,请使用输出属性和各种、输出属性,这些属性都具有每个配置变量

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


  • 我不知道你在问什么。如果查看FindGTest.cmake内部,您将看到它自己处理优化和调试版本,因此当您在MSVC中选择“调试”时,它将链接到调试,而对于“发布”,则链接到发布。或者您希望为自己的应用程序实现相同的功能?然后通过查看FindGTest.cmake来编写FindYourApp.cmake。@arrowdodger:显然它没有正确的方法,因为如果cmake_BUILD_类型与我选择的配置MSBuild不匹配,链接器就会失败(CRT不匹配)。嗯。IIRC,MSVC生成器完全忽略用户设置的CMAKE_构建_类型,并使用CMAKE_配置_类型。您不需要重新运行CMake来更改生成类型。