C++ 如何使cmakelists.txt编译使用在其他地方声明和实现的函数和类的cpp
我在2个头文件中定义了一些函数类,并在某个文件夹中的cpp文件中实现了这些函数类。我将它们用于位于同一目录中的一些cpp程序(我们称之为cpp1.cpp)。让我们称之为dir1 现在我的问题是: 我有另一个dir2,与dir1的级别相同,它有自己的CMakeLists.txt,我试图在其中编译另一个位于dir2的cpp文件(我们称之为cpp2.cpp)。这个新的cpp使用或应该使用dir1头文件和cpp文件中声明和定义的一些函数和类。 在我的cpp2.cpp中,我正在做:C++ 如何使cmakelists.txt编译使用在其他地方声明和实现的函数和类的cpp,c++,cmake,header-files,C++,Cmake,Header Files,我在2个头文件中定义了一些函数类,并在某个文件夹中的cpp文件中实现了这些函数类。我将它们用于位于同一目录中的一些cpp程序(我们称之为cpp1.cpp)。让我们称之为dir1 现在我的问题是: 我有另一个dir2,与dir1的级别相同,它有自己的CMakeLists.txt,我试图在其中编译另一个位于dir2的cpp文件(我们称之为cpp2.cpp)。这个新的cpp使用或应该使用dir1头文件和cpp文件中声明和定义的一些函数和类。 在我的cpp2.cpp中,我正在做: #include "h
#include "header1_from_dir1.h"
#include "header2_from_dir1.h"
这给了我一个错误:
错误:“func_name”未在此作用域中声明func_name(参数1)
^~~~~~~~~~~~
当我尝试将其包含在相对路径中时,它会编译并正常工作:
#include "../dir1/header1_from_dir1.h"
#include "../dir1/header2_from_dir1.h"
为什么会这样?如何修改CMakelists.txt以正确“查看”dir1中定义的函数
简而言之,在CMakeLists中,我有:
include_directories(../dir1)
add_executable(cpp2 cpp2.cpp ../dir1/cpp_header1.cpp ../dir1/cpp_header2.cpp)
target_include_directories(cpp2 PUBLIC ./dir1)
target_link_libraries(some_library_from_another_place)
install(TARGETS cpp2 DESTINATION ${CMAKE_SOURCE_DIR}/bin/${TARGET_LOCATION})
目录结构:
.
|-- dir1
| |-- bin
| |-- build
| |-- header1_from_dir1.h
| |-- header2_from_dir1.h
| |-- cpp_header1.cpp
| |-- cpp_header1.cpp
| |-- cpp1.cpp // this uses functions and clases from above files
| `-- CMakeLists.txt // this is for above cpp1.cpp
|-- dir2
| |-- bin
| |-- build
| |-- cpp2.cpp // this uses functions and clases from
// dir1/cpp_header1.cpp
| `-- CMakeLists.txt // this is for above cpp2.cpp and have briefly
// described its contents
如何修改CMakelists.txt以正确“查看”dir1中定义的函数
可以按以下方式修改项目:
项目结构:
┣ 从文件:
相对路径在INSTALL_接口表达式中是允许的,并且相对于安装前缀进行解释
因此,相对路径不是您想要的。您需要为它指定绝对路径,以便为编译正确解释。使用CMAKE\u CURRENT\u SOURCE\u DIR
指定当前源目录的相对路径。target\u include\u目录(cpp2 PUBLIC./dir1)
-您不是指target\u include\u目录(cpp2 PUBLIC./dir1)
或更好的target\u include\u目录(cpp2 PUBLIC${CMAKE\u CURRENT\u SOURCE\u DIR}//dir1)
我想说../dir1是正确的,因为我有一个用于编译/构建的脚本,并且我已经尝试使用${CMAKE_CURRENT_SOURCE_DIR}/./dir1,但有相同的错误消息:您的目录/文件结构是什么?你能展示/画它吗?哪里是dir1
(或者有两个dir1
?)尝试target\u include\u目录(cpp2 PUBLIC${CMAKE\u CURRENT\u SOURCE\u DIR}/dir1)
这个CMakeLists.txt在哪里?它是在dir1中还是在dir2中还是在root中?为什么要调用*include_directories()
两次?在本例中,这些调用是多余的。@squareskittles是的,您是对的,尽管删除并没有清除主要问题。我应该说我在使用cmake方面并不像你可能已经看到的那样先进。我已经改用cmake_CURRENT_SOURCE_DIR,但结果是一样的。消息调用显示两种使用方式的正确路径。另一方面,从include_目录中删除所需的文件不会像预期的那样打印我,因为它找不到包含的头文件。我看到的错误我只是解释为它找不到具有函数的对象。。。这听起来正确吗?它找不到具有该功能的对象
-您没有源代码cpp1.cpp
,请检查对象文件。老实说,为什么不从dir1链接到库呢?我只想target\u link\u libraries(cpp2 PUBLIC cpp1)
asumingdir1/CMakeLists.txt
以与dir2类似的方式添加库(cpp1)
。不幸的是,我不得不将CMakeLists.txt同时保存在dir1和dir2中,因为它们都在构建不同的应用程序。这是一个更大项目的一部分。我也在想,创建一个库将是一种更好的方法,可以将文件保存在两个目录中。只需确保在dir2/CMakeLists.txt
中向现有目标添加一个新目标cpp2
。是的,我将新目标添加为:add_executable(cpp2 cpp2.cpp../dir1/cpp_header1.cpp../dir1/cpp_header2.cpp)该命令的目标源是什么?在cmake doc网站上找到它,我似乎很高兴。