使用"标准"目录布局进行CMake(Linux)

Coo*_*J86 9 cmake

假设我有一个带有伪标准目录布局的简单hello项目

helloworld/
  src/
    main.c
    say.c
    say-helper.c
  include/
    say.h
    say-helper.h
  build/
Run Code Online (Sandbox Code Playgroud)

然后跑了

cd ~/helloworld/build
cmake ..
make
Run Code Online (Sandbox Code Playgroud)

我希望如下

helloworld/
  build/lib/
    libsay.a
    libsay.so
    libsay.so.1.0.0
  tmp/obj/
    main.o
    say.o
  build/bin/
    hello
Run Code Online (Sandbox Code Playgroud)

make install我期待之后

/usr/local/lib/
  libsay.a
  libsay.so
  libsay.so.1.0.0
/usr/local/bin/
  hello
Run Code Online (Sandbox Code Playgroud)

将在什么CMakeLists.txt样子,对于这种设置?

我一直在寻找示例,但我发现的唯一一个显示如何添加库和可执行文件不起作用.

man*_*nol 8

描述项目的基本命令:

INCLUDE_DIRECTORIES(include)
ADD_LIBRARY(say src/say.c src/say-helper.c)

ADD_EXECUTABLE(hello src/main.c)
TARGET_LINK_LIBRARIES(hello say)
Run Code Online (Sandbox Code Playgroud)

这是为了将libs和可执行文件放在build目录中,将它放在你的CMakeLists.txt中:

SET (CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin)
SET (CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib)
SET (CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib)
Run Code Online (Sandbox Code Playgroud)

对于安装,您指定

 install(TARGETS say hello
            RUNTIME DESTINATION bin
            LIBRARY DESTINATION lib
            ARCHIVE DESTINATION lib)
Run Code Online (Sandbox Code Playgroud)

在您的CMakeLists.txt中,并在您的配置中将CMAKE_INSTALL_PREFIX设置为/ usr/local.

我不确定你是否可以使用相同的名称同时构建静态和动态库.而且我不知道如何告诉CMake将obj文件放在某个特定的位置.