2016-08-25 2 views
2

UPDATE:Cygwin установку связи разделяемая библиотека

Удален старый вопрос о .so файлов. Они не предназначены для работы в Windows.

Я решил использовать нижеследующий файл заголовка. Я предполагаю, что это стандартное соглашение по использованию файла .h при каждом соединении с помощью C++?

mydll.h:

#ifndef mydll_h_ 
#define mydll_h_ 
void hello(); 
#endif 

myprog.cc:

#include "mydll.h" 
int main() 
{ 
    hello(); 
    return 0; 
} 

mydll.cc:

#include <iostream> 

void hello() 
{ 
    std::cout << "Hello World!\n"; 
} 

Кроме того, я попытался .dll библиотеку с помощью Cygwin с это руководство: https://cygwin.com/cygwin-ug-net/dll.html

Компиляция для их .c файлов работает, но я пытаюсь заставить ее работать для моих файлов .cc. Есть идеи?

mydll.cc:

#include <iostream> 

void hello() 
{ 
    std::cout << "Hello World!\n"; 
} 

myprog.cc:

int main() 
{ 
    hello(); 
    return 0; 
} 

я напечатал:

g++ -c mydll.cc 
g++ -shared -o mydll.dll mydll.o 

Но когда я типа:

g++ -o myprog myprog.cc -L./ -lmydll 

Я получаю:

myprog.cc: In function ‘int main()’: 
myprog.cc:4:10: error: ‘hello’ was not declared in this scope 
    hello(); 
+0

«hello» не был объявлен в этой области действия «это не имеет ничего общего с библиотеками. .cc - суффикс файла исходного кода C++. Вам нужно объявить функции на C++. –

+0

В окнах нет «разделяемых библиотек». Есть DLL. Суффикс имени файла по умолчанию для них - .dll. Cygwin не меняет этого. –

+0

Я попытался сменить функции, но при этом появляется такая же ошибка. На ваш второй комментарий, я думаю, это сужает проблему до второй. – Dobob

ответ

1

Вы столкнулись с проблемой компилятора; не проблема линкера. Компилятор сообщает вам, что когда он компилирует myprog.cc, он не может найти функцию hello().

Вам необходимо написать объявление функции для hello(). Примечание: вы являетесь функцией определение для hello() находится в mydll.cc.

Объявление функции будет просто:

void hello(); 

(1) Вы можете поместить одну строку кода в myprog.ccвышеint main().

(2) Вы можете также поместить одну строку кода в файле заголовка, который включен по крайней мере по myprog.cc и, возможно, по mydll.cc. Но хорошая практика программирования диктует, что заголовочный файл должен быть включен обоими.

Если следовать вариант 1, следующая версия myprog.cc будет исправить ошибку компилятора:

void hello(); // "extern void hello();" would be more proper. 

int main() 
{ 
    hello(); 
    return 0; 
} 

Вариант 2 будет включать:

myprog.cc:

#include <mydll.h> 

int main() 
{ 
    hello(); 
    return 0; 
} 

В любом случае результаты в успешная компиляция и исполнение:

>g++ -c mydll.cc 
>g++ -shared -o mydll.dll mydll.o 
>g++ -o myprog myprog.cc -L./ -lmydll 
>./myprog.exe 
Hello World! 
> 
Смежные вопросы