将程序链接到Eclipse中的C ++项目? Linux的

时间:2011-12-04 07:33:38

标签: c++ linux eclipse linker undefined-reference

我获得了链接程序的命令:

g++ -o prog_name prog_name.cc -lsicklms-x -pthread

但是,我没有使用命令行,我正在使用eclipse。

我的项目名为“测试”,我只有一个类“main.cpp”,即:

/*
 * Test.cpp
 *
 *  Created on: Dec 1, 2011
 *      Author: igvc
 */
#include <iostream>
#include <sicklms-1.0/SickLMS.hh>
using namespace std;
using namespace SickToolbox;
int main(int argc, char *argv[]) {
    /* Specify device path and baud */
    string dev_path = "/dev/ttyUSB0";
    sick_lms_baud_t lms_baud = SickLMS::SICK_BAUD_38400;
    /* Define buffers for return values */
    unsigned int measurements[SickLMS::SICK_MAX_NUM_MEASUREMENTS] = {0};
    unsigned int num_measurements = 0;
    /* Instantiate the object */
    SickLMS sick_lms(dev_path);
    try {
        /* Initialize the device */
        sick_lms.Initialize(lms_baud);
        /* Grab some measurements */
        for(unsigned int i = 0; i < 10; i++) {
            sick_lms.GetSickScan(measurements,num_measurements);
            cout << "\t" << num_measurements << endl;
        }
        /* Uninitialize the device */
        sick_lms.Uninitialize();
    }
    catch(...) {
        cerr << "error" << endl;
        return -1;
    }
    return 0;
}   

我收到了所有这些错误:

undefined reference to `SickToolbox::SickLMS::~SickLMS()`
undefined reference to `SickToolbox::SickLMS::GetSickScan(unsigned int*, unsigned int&, unsigned int*, unsigned int*, unsigned int*, unsigned int*, unsigned int*)' 
undefined reference to `SickToolbox::SickLMS::Initialize(SickToolbox::SickLMS::sick_lms_baud_t)'
undefined reference to `SickToolbox::SickLMS::SickLMS(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)'
undefined reference to `SickToolbox::SickLMS::Uninitialize()'

所以我认为这是一个链接问题。我有上面的命令链接,教程说这是必需的,但我不知道如何在eclipse中设置它。

代码显示为#include sicklms-1.0/SickLMS.hh,我确实转到了Project&gt;属性&gt; C / C ++ Build&gt;设置&gt; GCC C ++编译器&gt;目录并将目录添加到.h文件中并解决了该问题,但现在我收到了这些错误。我去了GCC C ++ Linker&gt; Libraries&gt;库搜索路径(-L)并添加了sicktoolbox-1.0.1目录,但我不知道在库(-l)部分放什么。

感谢您的帮助,我真的坚持这一点。

2 个答案:

答案 0 :(得分:2)

大概你在使用Eclipse CDT?

右键单击您的项目,然后从上下文菜单中选择“属性”。

在Properties对话框中,选择C / C ++ Build-&gt; Settings-&gt; GCC C ++ Linker-&gt; Libraries

在“库”框中,单击+按钮添加新库,键入 sicklms

您的库必须位于链接器的路径中。 / usr / lib和/ usr / local / lib是相当标准的。对于-l,库名必须是libsicklms.a或libsicklms.so,因为链接器会将 lib 添加到库名。

如果使用./configure&amp;&amp;来源安装了sicklms。制造&amp;&amp; make install然后库应该在标准库路径中,即/ usr / lib或/ usr / local / lib,否则你的问题不是你的链接器,而是安装了sicklms的方式。

如果上述任何说明不可行,您需要告诉我

a)Eclipse版本(Galileo,Indigo等)

b)如果您安装了CDT。

c)您的系统上是否安装了病毒(包管理器,从源代码构建等)。

答案 1 :(得分:0)

完全基于您在此处所写的内容,我想想-l部分,您需要添加-lpthread -lsicklms-x。但是,假设Eclipse提供了足够的智能来替换make(1)这样的工具,这对于重建大型项目非常有用。

尝试在项目目录中创建Makefile,如下所示:

LDFLAGS=-L/path/to/sicklms-directory -lsicklms-x -lpthread

运行make然后给出:

$ make main
g++   -L/path/to/sicklms-directory -lsicklms-x -lpthread  main.cpp   -o main
/usr/bin/ld.bfd.real: cannot find -lsicklms-x
collect2: ld returned 1 exit status
make: *** [main] Error 1

(它失败了,因为我没有你的库。但它确实显示了为尝试构建源而执行的命令行。)

您也可以对编译Java程序进行一些简单的更改。我只能轻松获得超简单的Java源代码,但以下Makefile让我可以轻松地重新构建它们:

$ cat Makefile
.SUFFIXES: .java .class

.java.class:
    javac $<

all: Echo.class Test.class Compress.class
$ make Echo.class Test.class
javac Echo.java
make: `Test.class' is up to date.
$ rm *class
$ make
javac Echo.java
javac Test.java
javac Compress.java

(请注意,缩进行是使用制表符缩进的。它必须是一个制表符。make(1)在一些非常不方便的方式中是过时的。)