首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CMake的等价于Visual的属性表(.vsprops)

CMake的等价于Visual的属性表(.vsprops)
EN

Stack Overflow用户
提问于 2015-02-02 17:57:36
回答 2查看 1.8K关注 0票数 5

我正在尝试从Visual迁移到Jetbrains‘(超棒的) CLion IDE,它使用CMake来组织项目。

到目前为止,转换一直很顺利:创建CMake项目并将它们导入CLion很容易,我可以在一个平台上开始编码,然后在另一个平台上继续编写代码,没有问题。

但是,在CMake中找不到与Visual相对应的一个方面是财产表:我主要使用它们来保存包含目录的路径和库的链接库(即每个库都有一个.vsprops文件,例如OpenCV.vspropsBoost.vsprops等)。

这样,在VS中,我可以在不同的项目之间共享库的.vsprops文件,而不必每次都配置路径/库。

CMake是否有类似于Visual的属性表的机制?如何将库的include/lib存储在CMake可解析的文件中,然后在CMakeLists.txt中“导入”它,以便链接到库中?

基本上,我想做的是:

  1. 为给定的库创建一个"cmake属性表“(因为没有更好的名称)。
  2. 然后,在CMakeLists.txt中,编写类似于link_target_to_libs(myTarget "path/to/propertySheet1" "path/to/propertySheet2" ...)的东西。
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-02-07 14:19:57

由于我真的希望将库的包含/链接变成一行命令,而且就我对CMake的基本知识而言,我认为应该做出一些妥协--主要是在CMakeLists.txt和“属性表”之间共享目标名称的变量。所以这是我的解决方案..。除非有人提出更简单/更干净的建议:

  1. CMake属性表是.cmake文本文件,
  2. 众所周知的变量名--TARGET--指定目标(即add_executable()的第一个参数),
  3. 除了特定于库的命令外,.cmake文件还包含对target_include_directories(${TARGET} PRIVATE ${PATH_TO_INCLUDE_DIR})target_link_libraries(${TARGET} ${LIST_OF_LIBS})的调用,
  4. 为了对库使用/链接,请在include("path/to/.cmake")中调用CMakeLists.txt

我已经成功地构建并执行了一个简单的程序,它使用X11和OpenCV来处理以下文件:

x11.cmake

代码语言:javascript
复制
target_include_directories(${TARGET} PRIVATE "/usr/include/X11")
target_link_libraries(${TARGET} "/usr/lib/x86_64-linux-gnu/libX11.so")

opencv.cmake

代码语言:javascript
复制
# OpenCV-specific stuff
set(OpenCV_DIR "/PATH/TO/OPENCV/INSTALL/DIR/share/OpenCV") # path to OpenCVConfig.cmake
find_package(OpenCV REQUIRED)
# include path
target_include_directories(${TARGET} PRIVATE ${OpenCV_INCLUDE_DIRS})
# linking libs
target_link_libraries(${TARGET} opencv_world opencv_ts)

CMakeLists.txt

代码语言:javascript
复制
cmake_minimum_required(VERSION 2.8.4)
project(hello_clion)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

## hello-clion ##############################
# make a new target name
set(TARGET hello-clion)

# find sources
file(GLOB_RECURSE SOURCE_FILES "src/*.cpp" "src/*.hpp")

# declare a target
add_executable(${TARGET} ${SOURCE_FILES})

# link the libraries (to the last-declared ${TARGET}, which should be the last-added executable)
include("x11.cmake")
include("opencv.cmake")
#############################################

main.cpp

代码语言:javascript
复制
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <thread>

#include <opencv2/opencv.hpp>

#include <Xlib.h>

int main_x11()
{
    // adapted from: http://rosettacode.org/wiki/Window_creation/X11#Xlib
}

int main_ocv()
{
    // adapted from: http://docs.opencv.org/doc/tutorials/introduction/display_image/display_image.html#source-code
}

int main()
{
    using namespace std;

    thread tocv(main_ocv);
    thread tx11(main_x11);

    tocv.join();
    tx11.join();

    return 0;
}

现在,每次我想在项目/程序中使用OpenCV时,我只需将include("opencv.cmake")放在相应的CMakeLists.txt中即可。

票数 1
EN

Stack Overflow用户

发布于 2015-05-04 07:36:51

这似乎很好,但肯定有一些问题我还没有发现。(我担心添加相同target_link_libraries的多个宏会导致“已定义的”链接错误,但至少g++ 5.1.0句柄多次被赋予相同的库名而没有错误。)

在根CMakeLists.txt中, add_subdirectory()调用或全局之前的包括:

代码语言:javascript
复制
macro(USES_WX)
    include_directories(SYSTEM /usr/local/include/wx-3.0)
    include_directories(SYSTEM /usr/local/lib/wx/include/gtk3-unicode-3.0)
    link_directories(/usr/local/lib)
    add_definitions(-D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread)
    target_link_libraries(${TARGET} pthread wx_gtk3u_xrc-3.0 wx_gtk3u_html-3.0 wx_gtk3u_qa-3.0 wx_gtk3u_adv-3.0 wx_gtk3u_core-3.0 wx_baseu_xml-3.0 wx_baseu_net-3.0 wx_baseu-3.0)
endmacro()

(您可以使宏更加花哨,比如检查CMAKE_BUILD_TYPE是否是"Debug“或"Release”,以链接到适当的库、更改预处理器定义等。参见http://www.cmake.org/cmake/help/v3.0/command/if.html)

让你的项目的CMakeLists.txt像这样:

代码语言:javascript
复制
set(TARGET myProgramName)
add_executable(${TARGET} myProgramName.cpp)
USES_WX()

^^宏调用必须在add_executable()之后

而且,如果您想要多个目标支持,请修改上面所示的根CMakeLists.txt部分中的行:

代码语言:javascript
复制
    ...
    target_link_libraries(${ARGV0} pthread wx_gtk3u_xrc-3.0 ...)
    ...

并让您的项目的CMakeLists.txt像这样(减少行,但更多的错误机会):

代码语言:javascript
复制
add_executable(myProgramName myProgramName.cpp)
USES_WX(myProgramName)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28283812

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档