CMake включает внешние и собственные заголовки

У меня есть CMakelist.txt, куда я добавляю внешние файлы заголовков и lib. файлы для моей сборки. Теперь, когда я вызываю пользовательские заголовки ("myown.h") в своей основной функции, я получаю ошибки при выполнении связывания CMake.

Итак, я узнал, что мне нужно добавить свои собственные заголовки и.cpp в библиотеку с помощью add_library, а затем добавить их в 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
)

Вот подробный вывод:

Der Buildvorgang wurde am 01.11.2020 16:19:04 gestartet. Проект "C:\Projekte\Cpp\dev\Miele_Oculus\build\ALL_BUILD.vcxproj" на Knoten "1" (Standardziele). Das Projekt "C:\Projekte\Cpp\dev\Miele_Oculus\build\ALL_BUILD.vcxproj" (1) erstellt "C:\Projekte\Cpp\dev\Miele_Oculus\b uild\ZERO_CHECK.vcxproj" (2) 1 auf Knoten " (Standardziele). InitializeBuildStatus: "x64\Debug\ZERO_CHECK\ZERO_CHECK.tlog\unsuccessfulbuild" wird erstellt, da "AlwaysCreate" angegeben wurde. CustomBuild: Alle Ausgaben sind aktuell. FinalizeBuildStatus: Die Datei "x64\Debug\ZERO_CHECK\ZERO_CHECK.tlog\unsuccessfulbuild" 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 (Standardziele).

Das Projekt "C:\Projekte\Cpp\dev\Miele_Oculus\build\ALL_BUILD.vcxproj" (1) erstellt "C: \ Projekte \ Cpp \ dev \ Miele_Oculus \ b uild \ MIELE_OCULUS.vcxproj" (3) 1 auf Knoten "(Standardziele). Проект "C:\Projekte\Cpp\dev\Miele_Oculus\build\MIELE_OCULUS.vcxproj" (3) erstellt "C:\Projekte\Cpp\dev\Miele_Oculu s\build\mylib.vcxproj" (4) на Knoten "1" (Standardziele). InitializeBuildStatus: "mylib.dir\Debug\mylib.tlog\unsuccessfulbuild" вирд эрстеллт, да "AlwaysCreate" не изменяет. CustomBuild: Alle Ausgaben sind aktuell. VcpkgTripletSelection: Использование триплета "x64-windows" из "C:\Projekte\Cpp\dev\vcpkg\installed\x64-windows" ClCompile: Все Ausgaben sind aktuell. Lib: Alle Ausgaben sind aktuell. mylib.vcxproj -> C:\Projekte\Cpp\dev\Miele_Oculus\build\Debug\mylib.lib AppLocalFromInstalled: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy Bypass -noprofile -File "C:\Projekte\Cpp\d ev\vcpkg\scripts\buildsystems\msbuild\applocal.ps1" "C:\Projekte\Cpp\dev\Miele_Oculus\build\Debug\mylib.lib" "C:\Proj ekte\Cpp\dev\vcpkg\installed\x64-windows\debug\bin" "mylib.dir\Debug\mylib.tlog\mylib.write.1u.tlog" "mylib.dir\Debug \vcpkg.applocal.log" FinalizeBuildStatus: Die Datei "mylib.dir\Debug\mylib.tlog\unsuccessfulbuild" wird gelöscht. Актуальные метки времени от "mylib.dir\Debug\mylib.tlog\mylib.lastbuildstate". Die Erstellung von Projekt "C:\Projekte\Cpp\dev\Miele_Oculus\build\mylib.vcxproj" ist abgeschlossen (Standardziele).lib AppLocalFrom Установлено: C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell.exe -ExecutionPolicy Bypass -noprofile -File "C: \ Projekte \ Cpp \ d ev \ vcpkg \ scripts \ buildsystems \ msbuild \ applocal.ps1" " C: \ Projekte \ Cpp \ dev \ Miele_Oculus \ build \ Debug \ mylib.lib "" C: \ Proj ekte \ Cpp \ dev \ vcpkg \ installed \ x64-windows \ debug \ bin "" mylib.dir \ Debug \ mylib.tlog \ mylib.write.1u.tlog "" mylib.dir \ Debug \ vcpkg.applocal.log "FinalizeBuildStatus: Die Datei" mylib.dir \ Debug \ mylib.tlog \ unsuccessfulbuild "wird gelöscht. Актуальные метки времени от "mylib.dir\Debug\mylib.tlog\mylib.lastbuildstate". Die Erstellung von Projekt "C:\Projekte\Cpp\dev\Miele_Oculus\build\mylib.vcxproj" ist abgeschlossen (Standardziele).lib AppLocalFrom Установлено: C: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ powershell.exe -ExecutionPolicy Bypass -noprofile -File "C: \ Projekte \ Cpp \ d ev \ vcpkg \ scripts \ buildsystems \ msbuild \ applocal.ps1" " C: \ Projekte \ Cpp \ dev \ Miele_Oculus \ build \ Debug \ mylib.lib "" C: \ Proj ekte \ Cpp \ dev \ vcpkg \ installed \ x64-windows \ debug \ bin "" mylib.dir \ Debug \ mylib.tlog \ mylib.write.1u.tlog "" mylib.dir \ Debug \ vcpkg.applocal.log "FinalizeBuildStatus: Die Datei" mylib.dir \ Debug \ mylib.tlog \ unsuccessfulbuild "wird gelöscht. Актуальные метки времени от "mylib.dir\Debug\mylib.tlog\mylib.lastbuildstate". Die Erstellung von Projekt "C:\Projekte\Cpp\dev\Miele_Oculus\build\mylib.vcxproj" ist abgeschlossen (Standardziele).exe -ExecutionPolicy Bypass -noprofile -File "C: \ Projekte \ Cpp \ d ev \ vcpkg \ scripts \ buildsystems \ msbuild \ applocal.ps1" "C: \ Projekte \ Cpp \ dev \ Miele_Oculus \ build \ Debug \ mylib.lib "" C: \ Proj ekte \ Cpp \ dev \ vcpkg \ installed \ x64-windows \ debug \ bin "" mylib.dir \ Debug \ mylib.tlog \ mylib.write.1u.tlog "" mylib.dir \ Debug \ vcpkg.applocal.log "FinalizeBuildStatus: Die Datei" mylib.dir \ Debug \ mylib.tlog \ unsuccessfulbuild "wird gelöscht. Актуальные метки времени от "mylib.dir\Debug\mylib.tlog\mylib.lastbuildstate". Die Erstellung von Projekt "C:\Projekte\Cpp\dev\Miele_Oculus\build\mylib.vcxproj" ist abgeschlossen (Standardziele).exe -ExecutionPolicy Bypass -noprofile -File "C: \ Projekte \ Cpp \ d ev \ vcpkg \ scripts \ buildsystems \ msbuild \ applocal.ps1" "C: \ Projekte \ Cpp \ dev \ Miele_Oculus \ build \ Debug \ mylib.lib "" C: \ Proj ekte \ Cpp \ dev \ vcpkg \ installed \ x64-windows \ debug \ bin "" mylib.dir \ Debug \ mylib.tlog \ mylib.write.1u.tlog "" mylib.dir \ Debug \ vcpkg.applocal.log "FinalizeBuildStatus: Die Datei" mylib.dir \ Debug \ mylib.tlog \ unsuccessfulbuild "wird gelöscht. Актуальные метки времени от "mylib.dir\Debug\mylib.tlog\mylib.lastbuildstate". Die Erstellung von Projekt "C:\Projekte\Cpp\dev\Miele_Oculus\build\mylib.vcxproj" ist abgeschlossen (Standardziele)."C: \ Proj ekte \ Cpp \ dev \ vcpkg \ installed \ x64-windows \ debug \ bin" "mylib.dir \ Debug \ mylib.tlog \ mylib.write.1u.tlog" "mylib.dir \ Debug \ vcpkg.applocal.log "FinalizeBuildStatus: Die Datei" mylib.dir \ Debug \ mylib.tlog \ unsuccessfulbuild "wird gelöscht. Актуальные метки времени от "mylib.dir\Debug\mylib.tlog\mylib.lastbuildstate". Die Erstellung von Projekt "C:\Projekte\Cpp\dev\Miele_Oculus\build\mylib.vcxproj" ist abgeschlossen (Standardziele)."C: \ Proj ekte \ Cpp \ dev \ vcpkg \ installed \ x64-windows \ debug \ bin" "mylib.dir \ Debug \ mylib.tlog \ mylib.write.1u.tlog" "mylib.dir \ Debug \ vcpkg.applocal.log "FinalizeBuildStatus: Die Datei" mylib.dir \ Debug \ mylib.tlog \ unsuccessfulbuild "wird gelöscht. Актуальные метки времени от "mylib.dir\Debug\mylib.tlog\mylib.lastbuildstate". Die Erstellung von Projekt "C:\Projekte\Cpp\dev\Miele_Oculus\build\mylib.vcxproj" ist abgeschlossen (Standardziele).lastbuildstate ". Erstellung von Projekt" C: \ Projekte \ Cpp \ dev \ Miele_Oculus \ build \ mylib.vcxproj "ist abgeschlossen (Standardziele).lastbuildstate ". Erstellung von Projekt" C: \ Projekte \ Cpp \ dev \ Miele_Oculus \ build \ mylib.vcxproj "ist abgeschlossen (Standardziele).

InitializeBuildStatus: Актуализация меток времени от "MIELE_OCULUS.dir \ Debug \ MIELE_OCULUS.tlog \ unsuccessfulbuild". CustomBuild: Alle Ausgaben sind aktuell. VcpkgTripletSelection: Использование триплета "x64-windows" из "C:\Projekte\Cpp\dev\vcpkg\installed\x64-windows" ClCompile: Все Ausgaben sind aktuell. Ссылка: C: \ Program Files (x86) \ Microsoft Visual Studio \ 2019 \ Community \ VC \ Tools \ MSVC \ 14.27.29110 \ bin \ HostX64 \ x64 \ link.exe /ERRORREPORT:QUEUE /OUT: "C: \ Projekte \ Cpp \ dev \ Miele_Oculus \ build \ Debug \ MIELE_OCULUS.exe "/ INCREMENTAL /NOLOGO /LIBPATH:" C: / Projekte / Cpp / dev / vcpkg / installed / x64-windows / lib "/ LIBPATH:" C: / Projekte / Cpp / dev / vcpkg / installed / x64-windows / lib / Debu g "/ 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_O culus / (/Debug" / LIBPATH: C: / Projekte / Cpp / dev / Miele_Oculus / x86 /LIBPATH: C: / Projekte / Cpp / dev / Miele_Oculus / x86 / Debug /LIBPATH: "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.0.19041.0/um/x64 /LIBPATH: C: / Projekte / Cpp /dev/Miele_Oculus/Kits/10/Lib/10.0.19041.0/um/x64/Debug /LIBPATH: "C: \ Projekte \ Cpp \ dev \ vcpkg \ installed \ x64-windows \ deb ug \ lib "/ LIBPATH:" C: \ Projekte \ Cpp \ dev \ vcpkg \ installed \ x64-windows \ debug \ lib \ manual-link "cpprest_2_10.lib WS2_32.libDebug \ mylib.lib kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib "C: \ Projekte \ Cpp \ dev \ vcpkg \ installed \ x64-windows \debug\lib*.lib" /MANIFEST /MANIFESTUAC:"level='asIn voker' uiAccess=' ​​false'" /manifest:embed /DEBUG /PDB:"C:/Projekte/Cpp/dev/Miele_Oculus/build/Debug/MIELE_OCULUS.pdb" /SUBSYSTEM:CONSOLE /TLBID:1 /DYNAMICBASE /NXCPLOMPAT:"C:/Projekte/Cpp/dev/Miele_Oculus/build/Debug/MIELE_OCULUS .lib" / МАШИНА:X64 / машина:x64 MIELE_OCULUS.dir\Debug\main.obj ССЫЛКА: фатальная ошибка LNK1104: Datei "C:\Projekte\Cpp\dev\Miele_Oculus\build\Debug\MIELE_OCULUS.exe" kann nicht geöffnet w erden. [C:\Projekte\Cpp\dev\Miele_Oculus\build\MIELE_OCULUS.vcxproj] Erstellung des Projekts "C:\Projekte\Cpp\dev\Miele_Oculus\build\MIELE_OCULUS.vcxproj" ist abgeschlelossen.

Erstellung des Projekts "C:\Projekte\Cpp\dev\Miele_Oculus\build\ALL_BUILD.vcxproj" ist abgeschlossen (Standardziele) - FEHLER.

Fehler beim Buildvorgang.

"C:\Projekte\Cpp\dev\Miele_Oculus\build\ALL_BUILD.vcxproj" (Standardziel) (1) -> "C: \ Projekte \ Cpp \ dev \ Miele_Oculus \ build \ MIELE_OCULUS.vcxproj" (Standardziel) (3) -> (Link Ziel) -> LINK: фатальная ошибка LNK1104: Datei "C: \ Projekte \ Cpp \ dev \ Miele_Oculus \ build \ Debug \ MIELE_OCULUS.exe" kann nicht geöffnet werden. [C: \ Projekte \ Cpp \ dev \ Miele_Oculus \ build \ MIELE_OCULUS.vcxproj]

0 Warnung(en)
1 Fehler

Verstrichene Zeit 00:00:00.90

1 ответ

Теперь это работает

1: Добавление заголовка в вызов add_library не добавляет каталоги включения для заголовка. Эти каталоги необходимо добавить вручную с помощью 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

Большое спасибо Цывареву!:)

2:

"Странное" поведение было моей ошибкой, потому что я не знал, что удаляю выходной терминал в Windows, прежде чем начать новую сборку в командном окне

Спасибо вам, ребята!

Другие вопросы по тегам