Связывание программ с C ++ Project в Eclipse? Linux - PullRequest
2 голосов
/ 04 декабря 2011

Мне дана команда для связывания программ:

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

Однако я не использую командную строку, я использую eclipse.

Мой проект называется «Тест», и у меня есть только 1 класс «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, я перешел в «Проект»> «Свойства»> «Сборка C / C ++»> «Настройки»> «Компилятор GCC C ++»> «Каталоги» и добавил каталог в файл .h, и это решило эту проблему, но теперь я Я получаю эти ошибки. Я пошел в GCC C ++ Linker> Библиотеки> Путь поиска библиотеки (-L) и добавил каталог sicktoolbox-1.0.1, но я не знаю, что поместить в часть Библиотеки (-l).

Спасибо за любую помощь, я действительно застрял в этом.

Ответы [ 2 ]

2 голосов
/ 04 декабря 2011

Предположительно, вы используете Eclipse CDT?

Щелкните правой кнопкой мыши по своему проекту и выберите «Свойства» в контекстном меню.

В диалоговом окне «Свойства» выберите «C / C ++ Build-> Settings-»> GCC C ++ Linker-> Библиотеки

В поле «Библиотеки» нажмите кнопку +, чтобы добавить новую библиотеку, введите sicklms

Ваша библиотека должна находиться в компоновщикедорожка./ usr / lib и / usr / local / lib довольно стандартны.Имя библиотеки должно быть libsicklms.a или libsicklms.so для -l, так как компоновщик добавляет lib к имени библиотеки.

Если sicklms был установлен из источника с помощью ./configure && make &&make install, тогда библиотека должна находиться в стандартном пути к библиотеке, т. е. либо / usr / lib, либо / usr / local / lib, в противном случае ваша проблема не в компоновщике, а в способе установки sicklms.

Если какой-либо извышеприведенные инструкции не выполнимы, вам необходимо сообщить мне

a) Версия Eclipse (Galileo, Indigo и т. д.)

b) Если у вас установлен CDT.

c) Как в вашей системе был установлен sicklms (менеджер пакетов, собранный из исходного кода и т. д.).

0 голосов
/ 04 декабря 2011

Основываясь исключительно на том, что вы написали здесь, я думаю в части -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) является мощной архаикой в ​​некоторых серьезных неудобных отношениях.)

...