Cmake: связывание одного подкаталога с исполняемым файлом в другом подкаталоге [закрыто] ⇐ C++
-
Anonymous
Cmake: связывание одного подкаталога с исполняемым файлом в другом подкаталоге [закрыто]
У меня есть проект, структурированный следующим образом:
main.cpp CMakeLists.txt ---lib_a --------a_header.h --------a_source.cpp --------CMakeLists.txt ---job_b --------b_header.h --------b_source.cpp --------CMakeLists.txt Я хочу одновременно создать исполняемый файл для main.cpp с двумя библиотеками lib_a и job_b и еще одним исполняемым файлом b_source .cpp с библиотекой lib_a.
В настоящее время мой общий CMakeLists.txt выглядит следующим образом.
add_library (основной основной.cpp) add_subdirectory(src/lib_a) add_subdirectory(src/job_b) target_include_directories(main SHARED ${SOME_INCLUDE_DIRS} main.cpp) target_link_libraries (основная PUBLIC lib_a job_b) add_executable (запустить main.cpp) target_link_libraries (запустить основной)
И CmakeLists.txt в lib_a.
add_library(lib_a a_header.h a_source.h) add_library(lib_a::lib_a Псевдоним lib_a) target_include_directories(lib_a PUBLIC $\) target_link_libraries(lib_a PUBLIC ${SOME_LIBRARIES})
И, наконец, CmakeLists.txt в job_b
add_library(job_b b_header.h b_source.h) add_library(job_b::job_b алиас job_b) установить (lib_a_DIR $PATH_TO_LIB_A_COMPILED_DIRECTORY) find_package(lib_a) target_include_directories(job_b PUBLIC $\) target_link_libraries(job_b PUBLIC ${SOME_LIBRARIES} lib_a) add_executable(run_job_b b_source.cpp) target_link_libraries (run_job_b job_b)
Запуск cmake в основном каталоге работает нормально, но когда я запускаю make, он возвращает ошибки неопределенной ссылки из job_b< /code> пытаюсь использовать функции lib_a.
Фрагмент ошибки. Это лишь некоторые из многих неопределенных справочных ошибок. По сути, все, что определено в a_header.h и a_source.cpp, не связано с job_b, хотя я специально добавил target_link_libraries(job_b ПУБЛИЧНАЯ ${SOME_LIBRARIES} lib_a)
/usr/bin/ld: CMakeFiles/JOB_B.dir/job_b.cpp.o:(.data.rel.ro._ZTV9GPUSender[_ZTV9GPUSender]+0x28): неопределенная ссылка на `SampleClass::Size()' /usr/bin/ld: CMakeFiles/JOB_B.dir/job_b.cpp.o:(.data.rel.ro._ZTV9GPUSender[_ZTV9GPUSender]+0x30): неопределенная ссылка на `SampleClass::Расписание()' /usr/bin/ld: CMakeFiles/JOB_B.dir/job_b.cpp.o:(.data.rel.ro._ZTV9GPUSender[_ZTV9GPUSender]+0x38): неопределенная ссылка на `SampleClass::isTime()' /usr/bin/ld: CMakeFiles/JOB_B.dir/job_b.cpp.o:(.data.rel.ro._ZTV9GPUSender[_ZTV9GPUSender]+0x40): неопределенная ссылка на `SampleClass::check(std::chrono::time_point)' /usr/bin/ld: CMakeFiles/JOB_B.dir/job_b.cpp.o:(.data.rel.ro._ZTV9GPUSender[_ZTV9GPUSender]+0x48): неопределенная ссылка на `SampleClass::update(std::chrono::time_point)' /usr/bin/ld: CMakeFiles/JOB_B.dir/job_b.cpp.o:(.data.rel.ro._ZTV12SampleClassI11PackageIN2cv3MatEEE[_ZTV12SampleClassI11PackageIN2cv3MatEEE]+0x28): неопределенная ссылка на `SampleClass: :Размер' /usr/bin/ld: CMakeFiles/JOB_B.dir/job_b.cpp.o:(.data.rel.ro._ZTV12SampleClassI11PackageIN2cv3MatEEE[_ZTV12SampleClassI11PackageIN2cv3MatEEE]+0x30): неопределенная ссылка на `SampleClass: :Расписание()' Я не уверен, что я сделал не так. Буду очень признателен, если вы предложите какие-нибудь решения или лучший способ структурировать проект.
Спасибо.
У меня есть проект, структурированный следующим образом:
main.cpp CMakeLists.txt ---lib_a --------a_header.h --------a_source.cpp --------CMakeLists.txt ---job_b --------b_header.h --------b_source.cpp --------CMakeLists.txt Я хочу одновременно создать исполняемый файл для main.cpp с двумя библиотеками lib_a и job_b и еще одним исполняемым файлом b_source .cpp с библиотекой lib_a.
В настоящее время мой общий CMakeLists.txt выглядит следующим образом.
add_library (основной основной.cpp) add_subdirectory(src/lib_a) add_subdirectory(src/job_b) target_include_directories(main SHARED ${SOME_INCLUDE_DIRS} main.cpp) target_link_libraries (основная PUBLIC lib_a job_b) add_executable (запустить main.cpp) target_link_libraries (запустить основной)
И CmakeLists.txt в lib_a.
add_library(lib_a a_header.h a_source.h) add_library(lib_a::lib_a Псевдоним lib_a) target_include_directories(lib_a PUBLIC $\) target_link_libraries(lib_a PUBLIC ${SOME_LIBRARIES})
И, наконец, CmakeLists.txt в job_b
add_library(job_b b_header.h b_source.h) add_library(job_b::job_b алиас job_b) установить (lib_a_DIR $PATH_TO_LIB_A_COMPILED_DIRECTORY) find_package(lib_a) target_include_directories(job_b PUBLIC $\) target_link_libraries(job_b PUBLIC ${SOME_LIBRARIES} lib_a) add_executable(run_job_b b_source.cpp) target_link_libraries (run_job_b job_b)
Запуск cmake в основном каталоге работает нормально, но когда я запускаю make, он возвращает ошибки неопределенной ссылки из job_b< /code> пытаюсь использовать функции lib_a.
Фрагмент ошибки. Это лишь некоторые из многих неопределенных справочных ошибок. По сути, все, что определено в a_header.h и a_source.cpp, не связано с job_b, хотя я специально добавил target_link_libraries(job_b ПУБЛИЧНАЯ ${SOME_LIBRARIES} lib_a)
/usr/bin/ld: CMakeFiles/JOB_B.dir/job_b.cpp.o:(.data.rel.ro._ZTV9GPUSender[_ZTV9GPUSender]+0x28): неопределенная ссылка на `SampleClass::Size()' /usr/bin/ld: CMakeFiles/JOB_B.dir/job_b.cpp.o:(.data.rel.ro._ZTV9GPUSender[_ZTV9GPUSender]+0x30): неопределенная ссылка на `SampleClass::Расписание()' /usr/bin/ld: CMakeFiles/JOB_B.dir/job_b.cpp.o:(.data.rel.ro._ZTV9GPUSender[_ZTV9GPUSender]+0x38): неопределенная ссылка на `SampleClass::isTime()' /usr/bin/ld: CMakeFiles/JOB_B.dir/job_b.cpp.o:(.data.rel.ro._ZTV9GPUSender[_ZTV9GPUSender]+0x40): неопределенная ссылка на `SampleClass::check(std::chrono::time_point)' /usr/bin/ld: CMakeFiles/JOB_B.dir/job_b.cpp.o:(.data.rel.ro._ZTV9GPUSender[_ZTV9GPUSender]+0x48): неопределенная ссылка на `SampleClass::update(std::chrono::time_point)' /usr/bin/ld: CMakeFiles/JOB_B.dir/job_b.cpp.o:(.data.rel.ro._ZTV12SampleClassI11PackageIN2cv3MatEEE[_ZTV12SampleClassI11PackageIN2cv3MatEEE]+0x28): неопределенная ссылка на `SampleClass: :Размер' /usr/bin/ld: CMakeFiles/JOB_B.dir/job_b.cpp.o:(.data.rel.ro._ZTV12SampleClassI11PackageIN2cv3MatEEE[_ZTV12SampleClassI11PackageIN2cv3MatEEE]+0x30): неопределенная ссылка на `SampleClass: :Расписание()' Я не уверен, что я сделал не так. Буду очень признателен, если вы предложите какие-нибудь решения или лучший способ структурировать проект.
Спасибо.
Мобильная версия