[英]Make all files in a folder accessible to all projects (subdirectories)
我的存儲庫中有多個項目(子目錄)。 所有項目只有一個名為main.cpp
的可執行文件,它們都使用common
文件夾中的庫和#include
語句。 文件夾結構如下所示:
root
|
├────common
| ├──── example.h
| ├──── example.cpp
| ├──── *.h # many header files
| └──── *.cpp # many source files
|
├────Project_A
| ├──── CMakeLists.txt
| └──── main.cpp
|
├────Project_B
| ├──── CMakeLists.txt
| └──── main.cpp
|
└──── CMakeLists.txt
這是我編寫根目錄的 CMakeLists.txt 的嘗試
cmake_minimum_required (VERSION 3.8)
project ("root")
file(GLOB_RECURSE CommonLibs ${CMAKE_SOURCE_DIR}/common/*.cpp)
link_libraries(${CommonLibs})
add_subdirectory ("Project_A")
add_subdirectory ("Project_B")
Project_A 的 CMakeLists.txt
cmake_minimum_required (VERSION 3.8)
add_executable (Project_A "main.cpp")
Project_B 的 CMakeLists.txt
cmake_minimum_required (VERSION 3.8)
add_executable (Project_B "main.cpp")
但是,在運行任何項目時,我都會收到此錯誤:
LNK1107 invalid or corrupt file: cannot read at 0x7AC, file example.h
我不相信該文件已損壞,因為在我嘗試在 root 的 CMakeLists.txt 中使用link_libraries()
之前,我遇到了其他錯誤:
Unresolved external symbol SomeNamespace::ExampleClass::ExampleClass(bool)
諸如此類的其他問題並不能解決我的問題,因為它們通常使用更復雜的文件夾結構。 還有一些問題試圖只針對像這樣的單個項目,但我有多個項目。
你能提供一個簡潔的解決方案嗎?
將CMakeLists.txt
添加到您的common/
目錄:
root
|
├────common
| ├──── CMakeLists.txt <-------- Add this
| ├──── example.h
....
常見/CMakeLists.txt
file(GLOB_RECURSE CommonLibsFiles ${CMAKE_CURRENT_SRC_DIR}/*.cpp)
add_library(CommonLibs ${CommonLibsFiles})
...
根的 CMakeLists.txt
...
### NO NEED FOR THESE
file(GLOB_RECURSE CommonLibs ${CMAKE_SOURCE_DIR}/common/*.cpp)
link_libraries(${CommonLibs})
###
add_subdirectory(common) #CommonLibs will now be visible to children directories
...
現在根據需要鏈接庫。 例如項目 A :
Project_A 的 CMakeLists.txt
cmake_minimum_required (VERSION 3.8)
add_executable (Project_A "main.cpp")
target_link_libraries(Project_A PRIVATE CommonLibs) #link to common libs here,
父cmake 文件創建或可見的所有目標/變量對子文件可見。 反過來卻不正確。 為了讓孩子向父母公開他們的變量,他們需要明確指定PARENT_SCOPE
您的頂級 CMake 中的以下行沒有多大意義:
file(GLOB_RECURSE CommonLibs ${CMAKE_SOURCE_DIR}/common/*.cpp)
link_libraries(${CommonLibs})
link_libraries()
命令接受庫或庫目標,而不是變量(例如CommonLibs
)。 您可以使用CommonLibs
變量定義一個新的庫目標,然后使用link_libraries()
將庫目標鏈接到您的可執行文件:
file(GLOB_RECURSE CommonLibs ${CMAKE_SOURCE_DIR}/common/*.cpp)
# Add this line.
add_library(MyCommonLib SHARED ${CommonLibs})
link_libraries(MyCommonLib)
請注意,通常不鼓勵使用link_libraries()
,即使在 CMake 文檔本身中也是如此。 您應該更喜歡使用target_link_libraries
將MyCommonLib
鏈接到需要它的特定可執行文件。
target_link_libraries(Project_A PRIVATE MyCommonLib)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.