CMake包括外部标头和自己的标头



我有一个CMakelist.txt,在其中我添加了外部头文件和lib。我的构建文件。现在,当我在主函数中调用自定义标头("myown.h")时,在运行CMake链接时会出现错误。

因此,我发现我必须使用add_library将自己的头和.cpp添加到库中,然后将它们添加到target_link_libraries下。

然而,只要我想从自己的头调用代码,我就会在构建时遇到链接错误。

有人知道错误在哪里,或者我如何继续吗?这是我的CMakelist:

cmake_minimum_required(VERSION 3.0.0)
project(MIELE_OCULUS VERSION 0.1.0)
#Hier weden die include files gefunden
INCLUDE_DIRECTORIES(
C:/Projekte/Cpp/dev/vcpkg/installed/x64-windows/include
)
#Hier werden die lib files gefunden
LINK_DIRECTORIES(
C:/Projekte/Cpp/dev/vcpkg/installed/x64-windows/lib,
C:/Program Files (x86)/Windows Kits/10/Lib/10.0.19041.0/um/x64

)
add_library(
test
testclass.h
testclass.cpp
)
add_executable(MIELE_OCULUS 
main.cpp
)
TARGET_LINK_LIBRARIES(MIELE_OCULUS 
cpprest_2_10
WS2_32
test
)

更新:

通过CMakelist.txt中的这些更改,您可以构建程序,但在更改src代码或清理CMake项目后,链接错误将再次发生。

更改的CMakelist:

cmake_minimum_required(VERSION 3.0.0)
project(MIELE_OCULUS VERSION 0.1.0)
add_library(
mylib
includes/mylib/testclass.h
includes/mylib/testclass.cpp
)
#Hier weden die include files gefunden
TARGET_INCLUDE_DIRECTORIES(mylib PUBLIC 
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include/mylib>
$<INSTALL_INTERFACE:include/mylib>  # <prefix>/include/mylib
)
INCLUDE_DIRECTORIES(
C:/Projekte/Cpp/dev/vcpkg/installed/x64-windows/include
C:/Projekte/Cpp/dev/Miele_Oculus
)
#Hier werden die lib files gefunden
LINK_DIRECTORIES(
C:/Projekte/Cpp/dev/vcpkg/installed/x64-windows/lib
C:/Program Files (x86)/Windows Kits/10/Lib/10.0.19041.0/um/x64

)
add_executable(MIELE_OCULUS 
main.cpp
)
TARGET_LINK_LIBRARIES(MIELE_OCULUS 
cpprest_2_10
WS2_32
mylib
)

这里是详细的输出:

2020年11月1日下午16:19:04。Projekt";C: \Projekte\Cpp\dev\Miele_Oculus\build\ALL_build.vcxproj"auf Knoten";1〃;(标准)。Das Projekt";C: \Projekte\Cpp\dev\Miele_Oculus\build\ALL_build.vcxproj"(1) erstellt";C: \Projekte\Cpp\dev\Miele_Oculus\bbuild\ZERO_CHECK.vcxproj"(2) auf Knoten";1〃;(标准)。InitializeBuildStatus:"x64\Debug\ZERO_CHECK\ZERO_CHECK.tlog\未成功构建"wird erstellt,da";AlwaysCreate"安格格本·乌尔德。自定义构建:所有的Ausgaben都是无辜的。FinalizeBuild状态:Die Datei";x64\Debug\ZERO_CHECK\ZERO_CHECK.tlog\未成功构建"wird gelöscht。时间戳的知识;x64\Debug\ZERO_CHECK\ZERO_CHECK.tlog\ZERO-CHECK.lastbuildstate"。Die Erstellung von Projekt";C: \Projekte\Cpp\dev\Miele_Oculus\build\ZERO_CHECK.vcxproj"ist abgeschlossen(标准)。

Das Projekt";C: \Projekte\Cpp\dev\Miele_Oculus\build\ALL_build.vcxproj"(1) erstellt";C: \Projekte\Cpp\dev\Miele_Oculus\bbuild\MIELE_OCULUS.vcxproj"(3) auf Knoten";1〃;(标准)。Das Projekt";C: \Projekte\Cpp\dev\Mile_OCULS\build\MILE_Oculus.vcxproj"(3) erstellt";C: \Projekte\Cpp\dev\Miele_Oculus\build\mylib.vcxproj"(4) auf Knoten";1〃;(标准)。InitializeBuildStatus:"mylib.dir\Debug\mylib.tlog\构建失败"wird erstellt,da";AlwaysCreate"安格格本·乌尔德。自定义构建:所有的Ausgaben都是无辜的。VcpkgTriplet选择:使用三元组";x64窗口";从";C: \Projekte\Cpp\dev\vcpkg已安装\x64 windows"Cl编译:所有的Ausgaben都是无辜的。Lib:所有的Ausgaben都是无辜的。mylib.vcxproj->C: \Projekte\Cpp\dev\Miele_Oculus\build\Debug\mylib.libAppLocalFromInstalled:C: \Windows\System32\WindowsPowerShell \v1.0\powershell.exe-ExecutionPolicy Bypass-noprofile-File"C: \项目\ Cpp\dev\vcpkg\scripts\buildsystems\msbuild\applocal.ps1"quot;C: \Projekte\Cpp\dev\Miele_Oculus\build\Debug\mylib.lib"quot;C: \项目ekte\Cpp\dev\vcpkg已安装\x64 windows\debug\bin"quot;mylib.dir\Debug\mylib.tlog\mylib.write.1u.tlog"quot;mylib.dir\Debug\vcpkg.applocal.log"FinalizeBuild状态:Die Datei";mylib.dir\Debug\mylib.tlog\构建失败"wird gelöscht。时间戳的知识;mylib.dir\Debug\mylib.tlog\mylib.lastbuildstate"。Die Erstellung von Projekt";C: \Projekte\Cpp\dev\Miele_Oculus\build\mylib.vcxproj"是abgeschlossen(标准)。

InitializeBuildStatus:时间戳的知识;MIELE_OCULUS.dir\Debug\MILE_OCULUS.tlog\构建失败"。自定义构建:所有的Ausgaben都是无辜的。VcpkgTriplet选择:使用三元组";x64窗口";从";C: \Projekte\Cpp\dev\vcpkg已安装\x64 windows"Cl编译:所有的Ausgaben都是无辜的。链接:C: \Program Files(x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.27.29110\bin\HostX64\x64\link.exe/ERRORREPORT:排队/出局:";C: \Projekte\Cpp\dev\Mile_Oculus\build\Debug\MILE_Oculus.exe"增量/NOLOGO/LIBPATH:";C:/Projekte/Cpp/dev/vcpg/installed/x64-windows/lib"/LIBPATH:";C:/Projekte/Cpp/dev/vcpg/installed/x64 windows/lib/Debugg"/LIBPATH:C:/Program/LIBPATH:C://Program/Debug/LIBPATH:C:/Projekte/Cpp/dev/Miele_Oculus/Files/LIBPATH=C:/Projekte/Cpp/dev/Miele_Oculus/Files/Debug/LIBPATH:";C:/Projekte/Cpp/dev/Miele_Oculus/("/LIBPATH:"C:/Projekte/Cpp//dev/Miele_Oculus/(/Debug"/LIBPATH:C:/Projekte/Cpp/dev/Miele_Oculus/x6/LIBPATH:C:\/Projekte/Cpp/dev/Meele_Oculus/x6/Debug/LIB路径:";C:/Projekte/Cpp/dev/Miele_Oculus/)"/LIBPATH:";C:/Projekte/Cpp/dev/Miele_Oculus/)/Debug"/LIBPATH:/Windows/LIBPATH:/Windows/Debug/LIBPATH:C:/Projekte/Cpp/dev/Miele_Oculus/Kits/10/Lib/10.19041.0/um/x64/LIBPATH:C://Projekte/Cpp/dev/Miele_Oculus/Kits/10/Lib/10.19041.0/um/x64/Debug/LIBPATH:";C: \Projekte\Cpp\dev\vcpkg已安装\x64 windows\debug\lib"/LIBPATH:";C: \Projekte\Cpp\dev\vcpkg已安装\x64 windows\debug\lib\manual链接"cpprest_2_10.lib WS2_32.lib调试\mylib.lib内核32.lib用户32.lib gdi32.lib winspool.lib外壳32.lib ole32.lib油输出32.lib uuid.lib comdlg32.lib advapi32.lib";C: \Projekte\Cpp\dev\vcpkg已安装\x64 windows\debug\lib*.lib"歧管/歧管:";级别='asInvoker'uiAccess='false'"manifest:embed/DEBUG/PDB:";C:/Projekte/Cpp/dev/Mile_Oculus/build/Debug/MELE_Oculus.pdb";/子系统:CONSOLE/TLBID:1/DYNAMICBASE/NXCOMPAT/IIMPLIB:";C:/Projekte/Cpp/dev/Mile_Oculus/build/Debug/MILE_Oculus.lib"/MACHINE:X64/MACHINE:X64 MIELE_OCULUS.dir\Debug\main.obj链接:致命错误LNK1104:Datei";C: \Projekte\Cpp\dev\Mile_Oculus\build\Debug\MILE_Oculus.exe"kann nicht geöffnet w埃尔登。[C:\Projekte\Cpp\dev\Miele_OCULS\build\Miele_Oculus.vcxproj]Die Erstellung des Projekts";C: \Projekte\Cpp\dev\Mile_OCULS\build\MILE_Oculus.vcxproj"ist abgeschlossen(Standardziele)——费勒。

Die Erstellung des Projekts";C: \Projekte\Cpp\dev\Miele_Oculus\build\ALL_build.vcxproj"ist abgeschlossen(标准)——费勒。

Fehler beim Buildvorgang。

"C: \Projekte\Cpp\dev\Miele_Oculus\build\ALL_build.vcxproj"(Standardziel)(1)->"C: \Projekte\Cpp\dev\Mile_OCULS\build\MILE_Oculus.vcxproj"(Standardziel)(3)->(链接Ziel)->链接:致命错误LNK1104:Datei";C: \Projekte\Cpp\dev\Mile_Oculus\build\Debug\MILE_Oculus.exe"kann-nicht geöffnet韦登。[C:\Projekte\Cpp\dev\Miele_OCULS\build\Miele_Oculus.vcxproj]

0 Warnung(en)
1 Fehler

Verstrichene Zeit 00:00:00.90

现在它可以了

1:在add_library调用中添加标头不会为标头添加include目录。您需要手动添加这些目录,使用INCLUDE_directories或TARGET_INCLUDE_DIRECTORIES

我添加了这个部分:

#Eigene header Dateien include
TARGET_INCLUDE_DIRECTORIES(mylib PUBLIC 
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/includes/mylib>
$<INSTALL_INTERFACE:includes/mylib>  # <prefix>/includes/mylib

非常感谢Tsyvarev!:)

2:

";奇怪的";行为对我来说是一个严重的错误,因为我不知道我删除了windows bev中的输出终端,或者我在命令窗口中开始了一个新的构建

谢谢你们!

相关内容

最新更新