Связывание cURL в Makefile - PullRequest
4 голосов
/ 06 июля 2011

Мне нужна ссылка cURL в Ubuntu 11.04 после установки cURL по исходному коду.

.

Исправление проблемы

Сначала я обнаружил, что -l должен предшествовать -L , а затем обнаружил, что я не вводил переменную в make-файл.

.

Получить cURLКонфиги:

На моем терминале:

# curl-config --libs
-L/usr/local/lib -lcurl

# curl-config --cflags
-I/usr/local/include

Все в порядке, где в этом каталоге находятся файлы cURL.


Мой Makefile:

# Testing cURL
# MAKEFILE

# C++ Compiler (Default: g++)
CXX = g++
CFLAGS = -Wall -Werror

# Librarys
INCLUDE = -Iusr/local/include
LDFLAGS = -Lusr/local/lib 
LDLIBS = -lcurl

# Details
SOURCES = src/main.cpp
OUT = test

all: build

build: $(SOURCES)
    $(CXX) -o $(OUT) $(INCLUDE) $(CFLAGS) $(LDFLAGS) $(SOURCES)

Мой C ++ Исходный код:

#include <iostream>
#include <curl/curl.h>

int main( void )
{
    CURL *curl;
    CURLcode res;

    curl = curl_easy_init();
    if(curl) {
        curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
        res = curl_easy_perform(curl);
        curl_easy_cleanup(curl);
    }

    return 0;
}

И ОШИБКА:

# make
g++ -o test -Iusr/local/include -Wall -Werror -Lusr/local/lib  src/main.cpp 
/tmp/ccli90i2.o: In function `main':
main.cpp:(.text+0xa): undefined reference to `curl_easy_init'
main.cpp:(.text+0x31): undefined reference to `curl_easy_setopt'
main.cpp:(.text+0x3d): undefined reference to `curl_easy_perform'
main.cpp:(.text+0x4d): undefined reference to `curl_easy_cleanup'
collect2: ld returned 1 exit status
make: ** [build] Erro 1

Я знаю, что это ошибкане могу найти библиотеку, но для меня все правильно

Ответы [ 2 ]

4 голосов
/ 06 июля 2011

Это должно сделать работу. Вы действительно не связывались с CURL раньше.

build: $(SOURCES)
    $(CXX) -o $(OUT) $(INCLUDE) $(CFLAGS) $(LDFLAGS) $(LDLIBS) $(SOURCES)

Обратите внимание на добавлено $(LDLIBS).

О, я должен добавить, что в основном вы выбрасываете за борт встроенные правила GNU make (см. Вывод make -np) и определяете свои собственные. Я бы посоветовал вам либо использовать встроенные, если вы хотите полагаться на соответствующие переменные, чтобы их было достаточно для управления сборкой, либо вы все еще разбиваете его на этапы компиляции и компоновки для краткости.

Краткое объяснение: GNU make поставляется с правилом, которое устанавливает, как сделать файл .o из файла .cpp (или .c). Таким образом, ваш файл make может быть переписан (приблизительно)

# Testing cURL
# MAKEFILE

# C++ Compiler (Default: g++)
CXX = g++
CFLAGS = -Wall -Werror

# Librarys
INCLUDE = -I/usr/local/include
LDFLAGS = -L/usr/local/lib 
LDLIBS = -lcurl

# Details
SOURCES = src/main.cpp
OUT = test

.PHONY: all

all: build

$(OUT): $(patsubst %.cpp,%.o,$(SOURCES))

Это должно сгенерировать двоичный файл с именем test (содержимое OUT) и в противном случае использовать встроенные правила. Сделайте выводы из использования .o файлов, которые должны быть исходными файлами, поищите их и скомпилируйте их. Таким образом, неявно эта сборка будет запускать один вызов для каждого файла .cpp и один для этапа компоновки.

0 голосов
/ 06 июля 2011

Вам не хватает косой черты в начале путей ниже

-I/usr/local/include
-L/usr/local/lib
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...