Я работаю над проектом C++ для обработки 3D-сеток. (https://github.com/blackears/cyclops_tetrahedralizer). Я хочу добавить общедоступный файл C, который реализует некоторые продвинутые математические вычисления с плавающей запятой. (https://github.com/libigl/libigl-predicates)
Я использую cmake для сборки проекта и столкнулся с проблемой, когда он говорит, что не может найти символ для ссылки из файла предикатов.
unresolved external symbol orient3d referenced in function "public: static double __cdecl CyclopsTetra3D::Math::test_orient_3d(struct CyclopsTetra3D::Vector3 const &,struct CyclopsTetra3D::Vector3 const &,struct CyclopsTetra3D::Vector3 const &,struct CyclopsTetra3D::Vector3 const &)" (?test_orient_3d@Math@CyclopsTetra3D@@SANAEBUVector3@2@000@Z)
Этот метод
class Math {
public:
...
static real test_orient_3d(const Vector3& pa, const Vector3& pb, const Vector3& pc, const Vector3& pd) {
double a[3] = { pa.x, pa.y, pa.z };
double b[3] = { pb.x, pb.y, pb.z };
double c[3] = { pc.x, pc.y, pc.z };
double d[3] = { pd.x, pd.y, pd.z };
return orient3d(a, b, c, d);
}
orient3d определен в файле predicates.c.
По сути, я просто пытаюсь создать функцию-оболочку в своей математической библиотеке для этого метода C, но у меня есть только базовое представление о том, как собрать файл CMakeLists.txt.
Что мне нужно изменить, чтобы этот проект можно было связать?
Изменить:
Вот простой файл cpp, вызывающий ошибку ссылки:
unresolved external symbol orient3d referenced in function "void __cdecl test2(void)" (?test2@@YAXXZ)
#include "predicates/predicates.h"
void test2() {
double a[3];
double b[3];
double c[3];
double d[3];
orient3d(a, b, c, d);
}
int main(int argc, char **argv)
{
test2();
return 0;
}
Я думаю, это может быть связано с тем, как cmake настраивает процесс сборки. Я не знаю, почему редактор удалил этот тег.
Редактировать 2:
Теперь я решил эту проблему. В итоге я переместил файлы predicates.* в свой корневой каталог /src и переименовал predicates.c в predicates.cpp. Раньше я настроил файл CMakeLists.txt для поиска их в подкаталоге, но по какой-то причине он не работал.
Это мой новый рабочий файл CMakeLists.txt для всех, кому это может быть интересно:
cmake_minimum_required (VERSION 3.10)
project (CyclopsTetrahedralizer
VERSION 1.0
LANGUAGES CXX
)
# Enable Hot Reload for MSVC compilers if supported.
if (POLICY CMP0141)
cmake_policy(SET CMP0141 NEW)
set(CMAKE_MSVC_DEBUG_INFORMATION_FORMAT "$")
endif()
if ( UNIX )
set( CMAKE_CXX_FLAGS_DEBUG_INIT "-fstack-protector" )
elseif( WIN32 )
set( CMAKE_CXX_FLAGS_DEBUG_INIT "/GS" )
endif()
# Set the C++ standard globally
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
option(BUILD_EXECUTABLE "Build executable" ON)
option(BUILD_LIBRARY "Build library" OFF)
file(GLOB_RECURSE sources src/*.cpp src/*.h)
if(BUILD_LIBRARY)
add_library(cyclopsTetrahedralizerLib STATIC ${sources})
#Add compile time property
target_compile_definitions(cyclopsTetrahedralizerLib PRIVATE -DCYCLOPS_TESS_LIB)
endif()
if(BUILD_EXECUTABLE)
add_executable(cyclopsTetrahedralizer ${sources})
endif()
Подробнее здесь: https://stackoverflow.com/questions/798 ... -c-program
Как мне связать символы C в моей программе на C++? [закрыто] ⇐ C++
Программы на C++. Форум разработчиков
-
Anonymous
1771153096
Anonymous
Я работаю над проектом C++ для обработки 3D-сеток. (https://github.com/blackears/cyclops_tetrahedralizer). Я хочу добавить общедоступный файл C, который реализует некоторые продвинутые математические вычисления с плавающей запятой. (https://github.com/libigl/libigl-predicates)
Я использую cmake для сборки проекта и столкнулся с проблемой, когда он говорит, что не может найти символ для ссылки из файла предикатов.
unresolved external symbol orient3d referenced in function "public: static double __cdecl CyclopsTetra3D::Math::test_orient_3d(struct CyclopsTetra3D::Vector3 const &,struct CyclopsTetra3D::Vector3 const &,struct CyclopsTetra3D::Vector3 const &,struct CyclopsTetra3D::Vector3 const &)" (?test_orient_3d@Math@CyclopsTetra3D@@SANAEBUVector3@2@000@Z)
Этот метод
class Math {
public:
...
static real test_orient_3d(const Vector3& pa, const Vector3& pb, const Vector3& pc, const Vector3& pd) {
double a[3] = { pa.x, pa.y, pa.z };
double b[3] = { pb.x, pb.y, pb.z };
double c[3] = { pc.x, pc.y, pc.z };
double d[3] = { pd.x, pd.y, pd.z };
return orient3d(a, b, c, d);
}
orient3d определен в файле predicates.c.
По сути, я просто пытаюсь создать функцию-оболочку в своей математической библиотеке для этого метода C, но у меня есть только базовое представление о том, как собрать файл CMakeLists.txt.
Что мне нужно изменить, чтобы этот проект можно было связать?
Изменить:
Вот простой файл cpp, вызывающий ошибку ссылки:
unresolved external symbol orient3d referenced in function "void __cdecl test2(void)" (?test2@@YAXXZ)
#include "predicates/predicates.h"
void test2() {
double a[3];
double b[3];
double c[3];
double d[3];
orient3d(a, b, c, d);
}
int main(int argc, char **argv)
{
test2();
return 0;
}
Я думаю, это может быть связано с тем, как cmake настраивает процесс сборки. Я не знаю, почему редактор удалил этот тег.
Редактировать 2:
Теперь я решил эту проблему. В итоге я переместил файлы predicates.* в свой корневой каталог /src и переименовал predicates.c в predicates.cpp. Раньше я настроил файл CMakeLists.txt для поиска их в подкаталоге, но по какой-то причине он не работал.
Это мой новый рабочий файл CMakeLists.txt для всех, кому это может быть интересно:
cmake_minimum_required (VERSION 3.10)
project (CyclopsTetrahedralizer
VERSION 1.0
LANGUAGES CXX
)
# Enable Hot Reload for MSVC compilers if supported.
if (POLICY CMP0141)
cmake_policy(SET CMP0141 NEW)
set(CMAKE_MSVC_DEBUG_INFORMATION_FORMAT "$")
endif()
if ( UNIX )
set( CMAKE_CXX_FLAGS_DEBUG_INIT "-fstack-protector" )
elseif( WIN32 )
set( CMAKE_CXX_FLAGS_DEBUG_INIT "/GS" )
endif()
# Set the C++ standard globally
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
option(BUILD_EXECUTABLE "Build executable" ON)
option(BUILD_LIBRARY "Build library" OFF)
file(GLOB_RECURSE sources src/*.cpp src/*.h)
if(BUILD_LIBRARY)
add_library(cyclopsTetrahedralizerLib STATIC ${sources})
#Add compile time property
target_compile_definitions(cyclopsTetrahedralizerLib PRIVATE -DCYCLOPS_TESS_LIB)
endif()
if(BUILD_EXECUTABLE)
add_executable(cyclopsTetrahedralizer ${sources})
endif()
Подробнее здесь: [url]https://stackoverflow.com/questions/79889532/how-do-i-link-c-symbols-in-my-c-program[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия