C++ “错误”;未定义的引用;对于库的某些非内联方法

C++ “错误”;未定义的引用;对于库的某些非内联方法,c++,linker,cmake,mingw,C++,Linker,Cmake,Mingw,解决问题后,我有一个新问题: 情境:我有C项目,它使用C++编写的库。在C中,只有对函数的调用,但是这些函数的实现使用类 详细信息: #include "Start.h" void example() { start(); } 库编译时没有错误,但编译C项目会返回以下错误: ... Start.cpp:(.text+0x860): undefined reference to `InitialCondition::Load(std::string, bool)' Start.cpp:

解决问题后,我有一个新问题:

<强>情境:我有C项目,它使用C++编写的库。在C中,只有对函数的调用,但是这些函数的实现使用类

详细信息:

#include "Start.h"

void example()
{
    start();
}
库编译时没有错误,但编译C项目会返回以下错误:

...
Start.cpp:(.text+0x860): undefined reference to `InitialCondition::Load(std::string, bool)'
Start.cpp:(.text+0x227b): undefined reference to `InitialCondition::SetMachIC(double)'
...
概述:

Start.cpp

InitCondition.h

从C呼叫:

#include "Start.h"

void example()
{
    start();
}
由于库是使用
cmake
构建的,下面是与
CMakeLists.txt
相关的部分:

set(INITIALISATION_SRC InitialCondition.cpp)
set(INITIALISATION_HDR InitialCondition.h)

add_library(Init ${INITIALISATION_HDR} ${INITIALISATION_SRC})
set_target_properties (Init PROPERTIES
                            VERSION "${LIBRARY_VERSION}")

if(BUILD_SHARED_LIBS)
  set_target_properties (Init PROPERTIES
                              SOVERSION ${LIBRARY_SOVERSION}
                              FRAMEWORK ON)
endif()

install(TARGETS Init LIBRARY DESTINATION lib
                     ARCHIVE DESTINATION lib
                     RUNTIME DESTINATION lib
                     # For Mac
                     FRAMEWORK DESTINATION "/Library/Frameworks")
install(FILES ${INITIALISATION_HDR} DESTINATION include/Project/initialization)
(有一长串的
.cpp
.h
文件,我把它们缩短了一点)

注意:顺便说一句,仍然有一些非行方法调用没有出现这样的错误

注意:此文件位于子目录中。使用
add_子目录(初始化)

注意:
nm
已编译库的列表包含:
InitialCondition9SetMachined

为什么从C调用时没有这些方法的引用?即使库被链接并且方法的实现可用


编辑:

#include "Start.h"

void example()
{
    start();
}
以下是用于C的命令:

汇编:

gcc-I”“-O0-g-Wall-c-fmessage length=0-MMD-MP-MF“src/Test.d”-MT“src/Test.d”-o“src/Test.o”“../src/Test.c”
链接:

gcc-L”“-shared-o“libTest.dll”。/src/Test.o-L-lstdc++

Test.d
包含
#include

包含的所有文件的列表,C++会损坏名称,而C则不会。C++函数用类似< < /p>之类的方式修饰
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu


为了获得C样式名称的粗细,你应该使用<代码>外“C”{}} /Cuth>但是,老实说,我不确定它是如何与类交互的,或者C++的C++程序包括你的库。C++函数用类似< < /p>之类的方式修饰

\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu


为了获得C样式名称的粗细,你应该使用<代码>外“C”{}} /Cuth>但是,老实说,我不知道它是如何与类交互的,或者C++的项目包括你的库。经过几次修改后,我现在可以编译这两个。然而,这对我来说真的很奇怪,因为所有文件都存在于CmakeList中。

问题似乎是由损坏的cmake列表引起的。经过几次修改后,我现在可以编译这两个。然而,这对我来说真的很奇怪,因为所有文件都存在于CmakeList中。

您使用哪个命令来编译C代码?是否有可能生成一个最小的、可编译的测试用例,其中包含:1。只有最基本的要素才能重现这个问题。是否有足够的代码(和命令)来重现这个问题,而无需猜测或填空?这样我们就可以准确地判断出你在做什么,更好地指向正确的方向。你试过把C++应用程序链接到库吗?我想,当库被编译时,有一些内部未定义的引用。在第一个库显示“代码> t>代码>或<代码> u>代码>或者其他什么功能,是否在代码库>代码> >代码>?如果您不能将库与C++连接起来,那么您的库就有问题了。尝试用最小的C++例子来工作,那么它也应该用C来工作。你用哪个命令来编译C代码?它是否可能产生一个最小的可编译的测试用例:1。只有最基本的要素才能重现这个问题。是否有足够的代码(和命令)来重现这个问题,而无需猜测或填空?这样我们就可以准确地判断出你在做什么,更好地指向正确的方向。你试过把C++应用程序链接到库吗?我想,当库被编译时,有一些内部未定义的引用。在第一个库显示“代码> t>代码>或<代码> u>代码>或者其他什么功能,是否在代码库>代码> >代码>?如果您不能将库与C++连接起来,那么您的库就有问题了。尝试用最小的C++例子来处理它,那么它也应该用C来工作。在代码中使用了这个,但是没有把它插入到我的例子中。所有从C调用的函数都在这样一个
extern“C”
块中(在标题中),但是这不起作用。在我的代码中使用了它,但没有将其插入到我的示例中。所有从C调用的函数都在这样一个
extern“C”
块中(在标题中),但是这不起作用。
#include "Start.h"

void example()
{
    start();
}
set(INITIALISATION_SRC InitialCondition.cpp)
set(INITIALISATION_HDR InitialCondition.h)

add_library(Init ${INITIALISATION_HDR} ${INITIALISATION_SRC})
set_target_properties (Init PROPERTIES
                            VERSION "${LIBRARY_VERSION}")

if(BUILD_SHARED_LIBS)
  set_target_properties (Init PROPERTIES
                              SOVERSION ${LIBRARY_SOVERSION}
                              FRAMEWORK ON)
endif()

install(TARGETS Init LIBRARY DESTINATION lib
                     ARCHIVE DESTINATION lib
                     RUNTIME DESTINATION lib
                     # For Mac
                     FRAMEWORK DESTINATION "/Library/Frameworks")
install(FILES ${INITIALISATION_HDR} DESTINATION include/Project/initialization)
gcc -I"<include dir>" -O0 -g -Wall -c -fmessage-length=0 -MMD -MP -MF"src/Test.d" -MT"src/Test.d" -o "src/Test.o" "../src/Test.c"
gcc -L"<searchpath>" -shared -o "libTest.dll"  ./src/Test.o   -l<library name> -lstdc++