从c

时间:2016-06-15 06:56:54

标签: c++ c linux

我需要从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

中的环境变量

3 个答案:

答案 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