簡體   English   中英

如何設置帶有子文件夾的 CMake 項目?

[英]How do I set up a CMake project with subfolders?

我是 CMake 的新手,所以如果我的問題被證明是菜鳥,我深表歉意。

我正在嘗試在 C++ 中設置一個項目,其目錄結構類似於我在 Java 中編碼時創建的 Maven (src 目錄和構建目錄)

root
├── build (where to build)
├── CMakeLists.txt (main one)
├── compile_commands.json -> ./build/compile_commands.json
├── doc
├── Doxyfile
└── src
    ├── CMakeLists.txt
    ├── common
    │   └── Terminal.hpp
    ├── fsa
    │   ├── CMakeLists.txt
    │   ├── Machine.cpp
    │   ├── Machine.hpp
    │   └── MachineState.hpp
    └── main.cpp

我不知道如何正確設置 CMake 以便識別、編譯和鏈接所有文件。 特別是,我認為我應該使用(混合) add_subdirectory()add_executable()link_directories() ) 、 target_link_libraries( target_link_libraries()add_library()target_include_directories() ,但我不確定我是如何做到的。

我稍后提供了我的CMakeLists.txt文件,但是當我配置和編譯時,我得到:

/usr/bin/ld: fsa/libfsalib.a(Machine.cpp.o): in function `Machine::addState(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool, bool)':
Machine.cpp:(.text+0xd1): undefined reference to `MachineState::MachineState(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool)'
collect2: error: ld returned 1 exit status
make[2]: *** [src/CMakeFiles/elr1.dir/build.make:98: src/elr1] Error 1
make[1]: *** [CMakeFiles/Makefile2:115: src/CMakeFiles/elr1.dir/all] Error 2
make: *** [Makefile:91: all] Error 2

我做錯了什么? 編輯:原來這是我的一個非常愚蠢的錯誤,我忘了添加一個實現。 但是,仍然存在一些問題:

  • 如果這個項目/cmake結構是最佳實踐,你能告訴我嗎?
  • 我不知道應該在哪里使用link_directories()target_include_directories()
  • 更一般地說,我怎樣才能保持我的代碼庫整潔並編譯我的項目 提前致謝

我的命令是

to configure: "cmake -S /path_to_root_project -B /path_to_root_project/build -D CMAKE_EXPORT_COMPILE_COMMANDS=ON"
to compile: "cmake --build /path_to_root_project/build"

根項目/CMakeLists.txt:

cmake_minimum_required(VERSION 3.10)

# set the project name
project(elr1 VERSION 0.1)

set(CMAKE_CXX_STANDARD 11)

set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

add_subdirectory(src)

root_project/src/CMakeLists.txt:

add_subdirectory(fsa)

# add the executable
add_executable(elr1 main.cpp)

link_directories(fsa)

target_link_libraries(elr1 #target in which link
  fsalib #library name
  )

root_project/src/fsa/CMakeLists.txt:

add_library(fsalib #name
   Machine.cpp #files
   MachineState.hpp
   )

 target_include_directories(fsalib PUBLIC
  ${CMAKE_CURRENT_SOURCE_DIR}
  )

如果這個項目/cmake結構是最佳實踐,你能告訴我嗎?

沒有或無窮無盡的最佳實踐,每天都有人發明一個新的。 特別是關於如何構建你的項目,這與 CMake 無關。 以您想要的方式構建它,並且您認為它是最好的。 你的結構似乎完全沒問題。

看看無盡的谷歌搜索結果。 對於使用 Makefile 的大型 C++ 項目,什么是好的目錄結構? http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p1204r0.html項目。

As for CMake you can take a look at the ultimate https://github.com/friendlyanon/cmake-init , https://github.com/cmake-lint/cmake-lint ,https://gist.github.com /mbinna/c61dbb39bca0e4fb7d1f73b0d66a4fd1

我應該在哪里使用 link_directories() 和 target_include_directories()。

通常,您應該更喜歡target內容,即target_link_directories是非目標。

使用target_include_directories將路徑添加到#include <thishere>搜索路徑。

使用target_link_directories路徑添加到搜索路徑target_link_libraries(... this_library_here) 通常你想使用add_library(... IMPORTED) ,然后find_library ,而不是target_link_directories man ld

在您的項目中,沒有外部共享.so也沒有 static .a庫。 我認為根本沒有理由使用link_directories

如何保持我的代碼庫整潔並編譯我的項目?

好吧,您可以努力工作並經常清理您的項目。 記住定期鍛煉、睡眠和健康飲食。


而不是set(CMAKE_CXX_STANDARD 11)更喜歡target_set_properties(. .. CXX_STANDARD 11)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM