Дополнительные вопросы добавлены ниже, 4/11/2011
Я занимаюсь разработкой кроссплатформенного набора общих библиотек DLL / SOS и программ для тестирования на C ++, хотя я должен уметьдля поддержки C. Библиотеки будут поставляться только в виде объектного кода, но программы-тестеры будут поставляться с исходным кодом, чтобы наши клиенты могли иметь пример кода.По этой причине я разрабатываю библиотеки для загрузки во время выполнения, т.е. динамическое связывание с использованием dlopen () / LoadLibraryA ().
Я использую g ++ 4.4.3-4 на Umbutu 10.04 и VC ++ 2008 на Vista /64 (в 32-битном режиме).
В Windows все работает нормально (прямо сейчас).Однако, когда я компилирую в Linux, я получаю некоторые ошибки, которые я не могу понять.
Тестер и библиотека имеют несколько классов, закодированных в нескольких .cpp и .h.Классы и большинство всего в библиотеке, кроме основных точек входа, находятся в пространстве имен DISCOVER_NS.
Вот краткий набросок проекта:
Во-первых, признание, я сократилнабор имен, чтобы код был более читабельным.
Discover.cpp
Создает объект класса с указателем на него, называемый theMainObject типаDiscoverObject.
Имеет внешнюю функцию "C", которая возвращает theMainObject программе вызова как void *.
DiscoverObject имеет несколько методов и создает экземплярыдругие классы находятся в отдельных cpp и .h.Один конкретный метод с именем Hello (), который делает то, что вы ожидаете, он печатает тестовое сообщение "привет" ..
tester.cpp
Получает дескриптор библиотеки
получает указатель функции на функцию, которая возвращает theMainObject.
Выполняет функцию (указатель) и преобразует возвращаемый адрес из void * в DISCOVER_NS :: DiscoverObject * aDiscoverObject.
Запустите aDiscoverObject-> Hello ().
Я компилирую с:
CC = @g ++
gflags = -g3
cflags = -fPIC -Wall -pedantic
lib_linkflags: = -shared -fPIC -lstdc ++ -lrt -lpthread -rdynamic
tester_linkflags: = -ldl -lpthread
определяет = -D_ linux _ -D_DEBUG -D_IPC_ARCH_INTEL = 1 -D_THREAD_SAFE
Теперь, когда я компилирую, я получаю этиошибки: * Tester.cpp: 142: неопределенная ссылка на `Discover_NS :: DiscoverObject :: hello () '*
Я также получаю кучу других неопределенных ссылочных ошибок из Discover.so, например: *explore.so: неопределенная ссылка на `Discover_NS :: DeviceList :: ~ DeviceList () *
Я попытался сделать практически все в SO extern" C ".Без разницы.
Я попытался поместить ввескан.cpp в виде операторов, которые выглядят так: extern void Discover_NS :: OtherClass :: method (args);но это дает мне ошибки об ошибках "объявление вне класса не является дефиницией".
Я знаю, что это поможет увидеть код, но мне нужно время, чтобы вынуть что-то маленькое для публикации.
Кто-нибудь может предложить идеи для решения этой проблемы?
Спасибо,
Уэс
Решение Дмитрия было не совсем все исправление, но было необходимым элементом врешение.При проверке моего make-файла я обнаружил пару непреднамеренно дублированных строк, которые я удалил, и две «опечатки», где у меня был неправильный путь для -o, закодированных в этапы компиляции.Прерванные шаги скомпилированы logger.cpp и RemException.cpp:
./common/logger.o : ./common/logger.cpp
$(CC) $(gflags) $(cflags) -c $(defines) -I ./common
-I ./EdgeIO -I ./Discover
-o ./common/Debug/logger.o <+++++++++ path to .o was wrong
./common/logger.cpp 2>&1 | tee ./RemKonTester/logger.ERR
Тогда я обнаружил настоящую ошибку.Я полностью упустил тот факт, что я не собирал все мои .cpp в каталоге Discover !.Потребовался хороший час, чтобы удалить все придирки, но теперь она отлично компилирует из make-файла.
НОВАЯ ВЕРСИЯ ОРИГИНАЛЬНОГО ВОПРОСА: Теперь я знаю, что это будет работать через make-файл, как мне поговорить?Затметься сделать то же самое, что делает make-файл?
Спасибо, Дмитрий.
Уэс
Ну, моя проблема все еще здесь.
У меня есть код, скомпилированный с Дмитрием (@Dmitry)предложения на месте.Только они, кажется, вызывают отдельную проблему.Я хочу, чтобы мои библиотеки динамически связывались с основной тестовой программой во время выполнения.Добавление -l Discover -l EdgeIO к ссылке дает все для компиляции, но дает статическое связывание.
FYI, неиспользуемые "пи" так SOимеет число с плавающей запятой и, таким образом, будет компилироваться с поддержкой с плавающей запятой.Требуется, если вызывающий абонент хочет использовать числа с плавающей запятой.Кто-нибудь получил лучший способ заставить g ++ компилировать с включенной плавающей запятой?
После исправления многих ошибок Дмитрий помог мне найти, теперь я получаю такой вывод:
make
./Discover/dllmain.cpp: In function ‘void InitalizeLibraryServices()’:
./Discover/dllmain.cpp:175: warning: unused variable ‘pi’
./EdgeIO/dllMain.cpp: In function ‘void InitalizeLibraryServices()’:
./EdgeIO/dllMain.cpp:158: warning: unused variable ‘pi’
linking RemKonTester
gflags = -g3
tstlinkflags = -ldl -lpthread
defines = -D__linux__ -D_DEBUG -D_IPC_ARCH_INTEL=1 -D_THREAD_SAFE
./RemKonTester/Debug/RemKonTester.o: In function `main':
/home/wmiller/Projects/Eclipse/./RemKonTester/RemKonTester.cpp:81: undefined
reference to `RemKon_EdgeIO::EdgeIoObject::hello()'
/home/wmiller/Projects/Eclipse/./RemKonTester/RemKonTester.cpp:111: undefined
reference to `RemKon_Discover::DiscoverObject::hello()'
/home/wmiller/Projects/Eclipse/./RemKonTester/RemKonTester.cpp:116: undefined
reference to `RemKon_Discover::DiscoverObject::SetLogLevel(unsigned int)'
/home/wmiller/Projects/Eclipse/./RemKonTester/RemKonTester.cpp:117: undefined
reference to `RemKon_Discover::DiscoverObject::hello()'
/home/wmiller/Projects/Eclipse/./RemKonTester/RemKonTester.cpp:118: undefined
reference to `RemKon_Discover::DiscoverObject::LocalIpAddress(int)'
/home/wmiller/Projects/Eclipse/./RemKonTester/RemKonTester.cpp:122: undefined
reference to `RemKon_Discover::DiscoverObject::RegisterCallback(bool(*)
(void*), void*)'
/home/wmiller/Projects/Eclipse/./RemKonTester/RemKonTester.cpp:123: undefined
reference to `RemKon_Discover::DiscoverObject::Search()'
collect2: ld returned 1 exit status
Iполучить тот же набор сообщений об ошибках из Eclipse.
RemKonTester.cpp включает в себя все .h, где эти элементы объявлены.Я попробовал их с объявлениями extern "C" и не.
Надеясь на помощь,
Wes