gpt4 book ai didi

c++ - 从 C 调用 C++ 函数

转载 作者:太空宇宙 更新时间:2023-11-04 08:12:57 26 4
gpt4 key购买 nike

我需要从 C 访问 C++ 函数,但出现一些错误,例如:-

/tmp/ccUqcSZT.o: In function `main':
main.c:(.text+0x5): undefined reference to `load_alert_to_db'
collect2: error: ld returned 1 exit status

我的 main.c 代码是:-

    #include <stdio.h>
extern void load_alert_to_db(void);
int main(void){
/* Create empty queue */
load_alert_to_db();
return 0;
}

C++代码实现db_manager.cpp是:-

#include <sstream>
#include <iostream>
#include <sstream>
#include <string>
#include <ctime>
#include <cstdlib>
#include <algorithm>
#include <time.h>
#include <cstring>
#include <fstream>

//using namespace oracle::occi;
#include <iostream>
using namespace std;
extern "C" void load_alert_to_db(void)
{
cout<<"db occi"<<endl;
}

生成文件是:-

CC= g++
all:
$(CC) -c -Wall -Werror -fPIC db_manager.cpp
$(CC) -shared -o libdb_manager.so db_manager.o
gcc -L/home/oracle/Desktop/storage/ -Wall main.c -o data -ldb_manager
gcc -o data main.c

clean:
rm -f *.o data

所以请帮我看看哪一个是我的问题。我也包括

export LD_LIBRARY_PATH=/home/oracle/Desktop/storage/:$LD_LIBRARY_PATH

.bash_profile 中的环境变量

最佳答案

gcc -o data main.c

不确定为什么您的 makefile 中有这一行,因为它将编译 main.c 而不引用先前创建的库,因此导致 undefined symbol 错误,例如您所看到的错误。

尤其如此,因为您似乎在前一行中以正确的方式完成了它:

gcc -L/home/oracle/Desktop/storage/ -Wall main.c -o data -ldb_manager

但是,使用 makefile 的全部意义在于它会根据依赖关系为您计算出最少的必要命令。将大量命令集中到一个规则中往往会破坏该目的。你最好让你的规则更有针对性,例如(未经测试但应该接近):

all: data

data: main.o libdb_manager.so
gcc -o data main.o -ldb_manager

main.o: main.c
gcc -o main.o main.c

libdb_manager.so: db_manager.cpp
g++ -c -Wall -Werror -fPIC -o db_manager.o db_manager.cpp
g++ -shared -o libdb_manager.so db_manager.o

这样一来,如果您对一个部分(如 main.c)进行了微小的更改,它就不必去编译/链接构建树中的所有内容。

关于c++ - 从 C 调用 C++ 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37828119/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com