Cmakelists с частной связью, включеныC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Cmakelists с частной связью, включены

Сообщение Anonymous »

У меня есть некоторые проблемы с Cmake , которые я не знаю, как решить.fatal error: library_a.hpp: No such file or directory
< /code>
Я создал пример, чтобы продемонстрировать проблему. < /p>
структура проекта < /h2>
cmake-private-test/
library_a/
CMakeLists.txt
library_a.cpp
library_a.hpp
library_b/
CMakeLists.txt
library_b.cpp
library_b.hpp
cmake-build.sh
CMakeLists.txt
CMakePresets.json
main.cpp
< /code>
library_a< /code> < /h2>
  • CMakeLists.txt
add_library(
library_a
STATIC
library_a.cpp
)

target_include_directories(
library_a
PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}
)
< /code>
  • library_a.hpp
#ifndef LIBRARY_A
#define LIBRARY_A

struct TypeA {

int a;
};

#endif
< /code>
  • library_a.cpp
#include "library_a.hpp"
< /code>
library_b< /code> < /h2>
  • CMakeLists.txt
add_library(
library_b
STATIC
library_b.cpp
)

target_include_directories(
library_b
PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}
)

target_link_libraries(
library_b
PRIVATE
library_a
)
< /code>
  • library_b.hpp
#ifndef LIBRARY_B
#define LIBRARY_B

#include "library_a.hpp"

struct TypeB {

TypeA type_a;
};

#endif
< /code>
  • library_b.cpp
#include "library_b.hpp"
< /code>
cmake-build.sh
#!/bin/bash

cmake --preset=release -DCMAKE_CXX_COMPILER=g++-14
cmake --build --preset=release-build -j$(nproc)
< /code>
CMakePresets.json
{
"version": 3,
"configurePresets": [
{
"name": "release",
"displayName": "Linux Release",
"description": "release build for Linux",
"generator": "Unix Makefiles",
"binaryDir": "${sourceDir}/out/build/${presetName}",
"cacheVariables": {
"CMAKE_CXX_STANDARD": "23",
"CMAKE_BUILD_TYPE": "Release",
"CMAKE_INSTALL_PREFIX": "${sourceDir}/out/install/${presetName}",
}
}
],
"buildPresets": [
{
"name": "release-build",
"configurePreset": "release"
}
]
}
< /code>
CMakeLists.txt
cmake_minimum_required(VERSION 3.5)

project(cmake-private-test)

set(CMAKE_CXX_STANDARD 23)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_CXX_FLAGS_DEBUG_INIT "-Wall -Wextra -pedantic -Werror")
set(CMAKE_CXX_FLAGS_RELEASE_INIT "-Wall -Wextra -pedantic -Werror")

set(CMAKE_CXX_FLAGS_DEBUG "-g")
set(CMAKE_CXX_FLAGS_RELEASE "-O3")

add_subdirectory(library_a)
add_subdirectory(library_b)

add_executable(
cmake-test-executable
main.cpp
)

target_link_libraries(
cmake-test-executable
PRIVATE
library_b
)
< /code>
main.cpp
#include "library_b.hpp"

int main() {

TypeB type_b;

return 0;
}

Я думал, что это должно сработать, поскольку библиотека_б ссылки на частные to libral_a , что должно распространять каталоги для включения для библиотеки_а. Library_a Поскольку это некоторая личная деталь реализации. Затем я столкнулся с проблемами с столкновениями имени (нарушение множественного определения). Я мог бы разрешить эти именные столкновения, представляя пространства имен, и, вероятно, поступил бы позднее в качестве лучшей практики, но я подумал, что смогу решить проблему, уменьшив объем общественной связи. Затем я столкнулся с этим отдельным вопросом о том, что заголовки не могут быть найдены. /> http_protobuf_interface < /li>
< /ol>
Каждая из этих двух библиотек содержала частную вспомогательную библиотеку, которая обрабатывала некоторые вещи для котла. Те же имена символов были определены в вспомогательных библиотеках, и это вызвало столкновения имен.[ 87%] Building CXX object CMakeFiles/cmake-test-executable.dir/main.cpp.o
In file included from /home/user/cmake-private-test/main.cpp:3:
/home/user/cmake-private-test/library_b/library_b.hpp:4:10: fatal error: library_a.hpp: No such file or directory
4 | #include "library_a.hpp"
| ^~~~~~~~~~~~~~~
compilation terminated.
gmake[2]: *** [CMakeFiles/cmake-test-executable.dir/build.make:79: CMakeFiles/cmake-test-executable.dir/main.cpp.o] Error 1
gmake[1]: *** [CMakeFiles/Makefile2:157: CMakeFiles/cmake-test-executable.dir/all] Error 2
gmake: *** [Makefile:91: all] Error 2


Подробнее здесь: https://stackoverflow.com/questions/797 ... t-be-found
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»