Я работаю над проектом 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