Как мне связать символы C в моей программе на C++? [закрыто]C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как мне связать символы C в моей программе на C++? [закрыто]

Сообщение 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()


Подробнее здесь: https://stackoverflow.com/questions/798 ... -c-program
Ответить

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

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

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

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

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