我需要从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;
}
makefile是: -
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
答案 0 :(得分:1)
gcc -o data main.c
不确定为什么你的makefile中有这一行,因为它会编译main.c
而不用引用先前创建的库,因此导致一个未定义的符号错误,例如您正在看到的错误。
尤其如此,因为您似乎已在前一行以正确方式完成此操作:
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
),它就不必编译/链接你的构建树中的所有内容。
答案 1 :(得分:1)
您的makefile似乎完全被破坏并且随机,您甚至没有链接所需的目标文件。你可以简化这个:
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
就是这样:
all:
gcc -Wall -c main.c
g++ -Wall -c db_manager.cpp
g++ main.o db_manager.o -o data
答案 2 :(得分:0)
这是我需要做的: 假设C ++函数被称为Debug :: Write(str) 然后在您的hpp文件中执行以下操作:
void DebugTmp(char *str)
{
Debug::Write(str);
}
然后在相应的cpp文件中执行以下操作:
void DebugTmp(char *str);
然后在你调用DebugTmp的C文件中定义原型:
static void MyFunction( void )
{
DebugTmp("This is debug trace\n");
}
然后按如下方式调用:
app/views/shared/_index_table.html.erb