Форум программистов, компьютерный форум CyberForum.ru

Линковка плюсового кода - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 5.00
tiger()
3 / 3 / 0
Регистрация: 20.04.2011
Сообщений: 141
12.07.2013, 08:19     Линковка плюсового кода #1
Компилирую статическую библиотеку c++ для последующего ее включения в с-проект.

Делаю так:

set COMPILER=...\arm-elf-g++.exe
set LIB_COMPILER=...\arm-elf-ar.exe

%COMPILER% -o object_file.o source_file.c
%LIB_COMPILER% rc libname.a object_file.o

После компиляции получаю такие ошибки от линкера:

Код
c:/program files/fujitsu h61-series gcc toolchain/bin/../lib/gcc/arm-elf/4.4.6/.
./../../../arm-elf/lib/crt0.o: In function `start':
c:\mmic\toolchains\arm1176\trunk\gcc\build\newlib-1.19.0\arm-elf\libgloss\arm/..
/../../../../src/newlib-1.19.0/libgloss/arm/crt0.S:318: undefined reference to `
main'
c:/program files/fujitsu h61-series gcc toolchain/bin/../lib/gcc/arm-elf/4.4.6/.
./../../../arm-elf/lib\libc.a(lib_a-abort.o): In function `abort':
c:\mmic\toolchains\arm1176\trunk\gcc\build\newlib-1.19.0\arm-elf\newlib\libc\std
lib/../../../../../../src/newlib-1.19.0/newlib/libc/stdlib/abort.c:63: undefined
 reference to `_exit'
c:/program files/fujitsu h61-series gcc toolchain/bin/../lib/gcc/arm-elf/4.4.6/.
./../../../arm-elf/lib\libc.a(lib_a-fstatr.o): In function `_fstat_r':
c:\mmic\toolchains\arm1176\trunk\gcc\build\newlib-1.19.0\arm-elf\newlib\libc\ree
nt/../../../../../../src/newlib-1.19.0/newlib/libc/reent/fstatr.c:62: undefined
reference to `_fstat'
c:/program files/fujitsu h61-series gcc toolchain/bin/../lib/gcc/arm-elf/4.4.6/.
./../../../arm-elf/lib\libc.a(lib_a-openr.o): In function `_open_r':
c:\mmic\toolchains\arm1176\trunk\gcc\build\newlib-1.19.0\arm-elf\newlib\libc\ree
nt/../../../../../../src/newlib-1.19.0/newlib/libc/reent/openr.c:59: undefined r
eference to `_open'
c:/program files/fujitsu h61-series gcc toolchain/bin/../lib/gcc/arm-elf/4.4.6/.
./../../../arm-elf/lib\libc.a(lib_a-sbrkr.o): In function `_sbrk_r':
c:\mmic\toolchains\arm1176\trunk\gcc\build\newlib-1.19.0\arm-elf\newlib\libc\ree
nt/../../../../../../src/newlib-1.19.0/newlib/libc/reent/sbrkr.c:60: undefined r
eference to `_sbrk'
c:/program files/fujitsu h61-series gcc toolchain/bin/../lib/gcc/arm-elf/4.4.6/.
./../../../arm-elf/lib\libc.a(lib_a-signalr.o): In function `_kill_r':
c:\mmic\toolchains\arm1176\trunk\gcc\build\newlib-1.19.0\arm-elf\newlib\libc\ree
nt/../../../../../../src/newlib-1.19.0/newlib/libc/reent/signalr.c:61: undefined
 reference to `_kill'
c:/program files/fujitsu h61-series gcc toolchain/bin/../lib/gcc/arm-elf/4.4.6/.
./../../../arm-elf/lib\libc.a(lib_a-signalr.o): In function `_getpid_r':
c:\mmic\toolchains\arm1176\trunk\gcc\build\newlib-1.19.0\arm-elf\newlib\libc\ree
nt/../../../../../../src/newlib-1.19.0/newlib/libc/reent/signalr.c:96: undefined
 reference to `_getpid'
c:/program files/fujitsu h61-series gcc toolchain/bin/../lib/gcc/arm-elf/4.4.6/.
./../../../arm-elf/lib\libc.a(lib_a-writer.o): In function `_write_r':
c:\mmic\toolchains\arm1176\trunk\gcc\build\newlib-1.19.0\arm-elf\newlib\libc\ree
nt/../../../../../../src/newlib-1.19.0/newlib/libc/reent/writer.c:58: undefined
reference to `_write'
c:/program files/fujitsu h61-series gcc toolchain/bin/../lib/gcc/arm-elf/4.4.6/.
./../../../arm-elf/lib\libc.a(lib_a-closer.o): In function `_close_r':
c:\mmic\toolchains\arm1176\trunk\gcc\build\newlib-1.19.0\arm-elf\newlib\libc\ree
nt/../../../../../../src/newlib-1.19.0/newlib/libc/reent/closer.c:53: undefined
reference to `_close'
Какой-то библиотеки не хватает в компиляторе?
Или что-то в командной строке неправильно?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.07.2013, 08:19     Линковка плюсового кода
Посмотрите здесь:

Линковка проекта. C++
Линковка библиотек в VS C++2010 C++
C++ Линковка библиотек DirectX SDK
Статическая линковка C++
C++ Правильная линковка библиотек
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 1
12.07.2013, 08:35     Линковка плюсового кода #2
Цитата Сообщение от tiger() Посмотреть сообщение
Компилирую статическую библиотеку c++ для последующего ее включения в с-проект.
C++ компиляторы маскарируют имена функций
tiger()
3 / 3 / 0
Регистрация: 20.04.2011
Сообщений: 141
12.07.2013, 08:38  [ТС]     Линковка плюсового кода #3
Цитата Сообщение от Croessmah Посмотреть сообщение
C++ компиляторы маскарируют имена функций
А что это значит? Каким образом собрать либу можно?
anubis1768
4 / 4 / 0
Регистрация: 23.02.2013
Сообщений: 151
12.07.2013, 11:01     Линковка плюсового кода #4
это он использует для перегрузки функций. попробуй в .h файлах все функции в extern "C" обгорнуть
tiger()
3 / 3 / 0
Регистрация: 20.04.2011
Сообщений: 141
12.07.2013, 15:21  [ТС]     Линковка плюсового кода #5
Хм..

Extern "C" разве не для Си-компилятора ставится?
У меня в проекте во всех инклудах сразу было прописано типа
C++
1
2
3
4
#ifdef __cplusplus
extern "C"
{
#endif


В папке toolchain есть хидер с дефайнами этих функций в "старые" имена типа
C++
1
#define _write write
Может такой надо куда-то подключить?

Добавлено через 3 часа 6 минут
Заработало при команде
COMPILER -c -o object.o source.c

без ключа -c не работает. Но зато странная ситуация выходит: если в код ввожу что-нибудь совсем неправильное (незакрытые скобки например) то компилятор даже не ругается, а нормально генерит ошник и ашник...

если я правильно понял из мана ключ -c останавливает процесс после ассемблирования, то есть без линковки. если ключ убрать, возвращаются старые линковые ошибки.

может что-то неправильно компилируется? потому что проект не может найти из этой либы определение функции...
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16843 / 5264 / 323
Регистрация: 30.03.2009
Сообщений: 14,159
Записей в блоге: 26
12.07.2013, 16:13     Линковка плюсового кода #6
Цитата Сообщение от tiger() Посмотреть сообщение
без ключа -c не работает
Ключ -c генерирует объектный файл, в котором сохранена символьная таблица. Именно из объектных файлов должна состоять библиотека .a. В твоём первоначальном запуске делалась попытка сформировать исполняемый файл и далее получалась какая-то каша

Добавлено через 1 минуту
В идеале хотелось бы видеть все строки, которые ты исполняешь. Потому что глядя на выдачу ошибок можно только гадать, а что же ты там запустил

Добавлено через 1 минуту
Цитата Сообщение от tiger() Посмотреть сообщение
В папке toolchain есть хидер с дефайнами этих функций в "старые" имена типа
C++
1
#define _write write
А какие имена в настоящей libc? Если они без почерков, а у тебя при компиляции программы все имена заменяются на имена с подчерками, то естественно там не найдётся
tiger()
3 / 3 / 0
Регистрация: 20.04.2011
Сообщений: 141
15.07.2013, 07:31  [ТС]     Линковка плюсового кода #7
Цитата Сообщение от Evg Посмотреть сообщение
В идеале хотелось бы видеть все строки, которые ты исполняешь. Потому что глядя на выдачу ошибок можно только гадать, а что же ты там запустил
Ага, про -c понял, спасибо.

Запускаю такой батник:
Код
set COMPILER="J:\bin\arm-elf-g++.exe" 
set LIB_COMPILER="J:\bin\arm-elf-ar.exe"

set SOURCE="K:\src\jpeg_encoder.c"
set HEADERS="K:\src\jpeg_encoder.h" "K:\src\jpeg_encoder_external_c_api.h" "K:\src\jpeg_encoder.h"
set LIBRARY="K:\build\MB86H61\M-arm11-gnuarm\libjpeg_encoder.a"
set OBJECT_FILE="K:\build\MB86H61\M-arm11-gnuarm\jpeg_encoder.o"

%COMPILER% -mcpu=arm1176jzf-s -c -o %OBJECT_FILE% %SOURCE% %HEADERS%
%LIB_COMPILER% rc %LIBRARY% %OBJECT_FILE%
Гдне на J я смонтировал папку компилятора, а на K папку с исходниками для либы.

Добавлено через 39 минут
За выходные картина поменялась пока меня не было.
Раньше при попытке использования это библиотеки у меня выходит undefined reference к одной из функций хранящихся там.
Теперь каким-то чудом другое:
Код
../../install/MB86H61/lib/M-arm11-gnuarm/libjpeg_encoder.a: could not read symbols: Archive has no index; run ranlib to add one
Прогнал через ranlib - ничего не изменилось.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16843 / 5264 / 323
Регистрация: 30.03.2009
Сообщений: 14,159
Записей в блоге: 26
15.07.2013, 11:17     Линковка плюсового кода #8
К теме не относится, но непонятно, нафига HEADERS передаются в компилятор. gcc их проигнорирует (т.е. на формирование кода они никак не влияют)

Тоже к теме сильно не относится, но "ar" - это вовсе не compiler. Это архиватор (наподобие rar'а или zip'а), который попросту несколько файлов с расширением *.o складывает в один файл с расширением *.a.

А это уже по теме. Чтобы линкер мог норально использовать библиотеку *.a, требуется, чтобы у этой библиотеки была символьная таблица. Нормальный linux'овый ar символьную таблицу создаёт автоматически. Под windows наверное ar какой-то кастированный, а потому на полученную библиотеку нужно натравить программу ranlib (находится рядом с ar'ом), чтобы она создала символьную таблицу

Добавлено через 18 секунд
А.. ты через ranlib уже прогнал

Добавлено через 19 секунд
А.. ты через ranlib уже прогнал

Добавлено через 3 минуты
Положи в аттач твой файл libjpeg_encoder.a, попробую посмотреть на него. Может под линуксом утилиты его смогут распотрошить

Добавлено через 31 секунду
Цитата Сообщение от tiger() Посмотреть сообщение
Прогнал через ranlib - ничего не изменилось
Чисто на всякий случай - напиши, как ты "прогнал"
tiger()
3 / 3 / 0
Регистрация: 20.04.2011
Сообщений: 141
16.07.2013, 08:15  [ТС]     Линковка плюсового кода #9
Цитата Сообщение от Evg Посмотреть сообщение
К теме не относится, но непонятно, нафига HEADERS передаются в компилятор. gcc их проигнорирует (т.е. на формирование кода они никак не влияют)

Тоже к теме сильно не относится, но "ar" - это вовсе не compiler. Это архиватор (наподобие rar'а или zip'а), который попросту несколько файлов с расширением *.o складывает в один файл с расширением *.a.

Положи в аттач твой файл libjpeg_encoder.a, попробую посмотреть на него. Может под линуксом утилиты его смогут распотрошить

Чисто на всякий случай - напиши, как ты "прогнал"
HEADERS переменная есть в готовых makefiles, я когда по аналогии делал тоже вписал, но она не пригодилась, правда, можно убрать.

Про ar - ага, понял. Кстати. А тогда может и необязательно архивировать этот один .o в .a?
Мне нужно слинковать в один исполняемый файл ряд .o от gcc (+ряд библиотек) вместе с ОДНИМ .o от g++. Или он так просто к сишным объектникам не прилинкуется?

Прогонял так:
arm-elf-ranlib.exe "path/libname.a"

Присоединил в аттач исходную либу после компиляции (libjpeg_encoder.a) и такую, которая после ranlib-а получилась (post_libjpeg_encoder.a)
Вложения
Тип файла: zip libs.zip (254.7 Кб, 7 просмотров)
tiger()
3 / 3 / 0
Регистрация: 20.04.2011
Сообщений: 141
16.07.2013, 11:48  [ТС]     Линковка плюсового кода #10
Так, по ходу у меня вся проблема в том что индексация не происходит.
Что до что после ranlib одинаково ругается словами "../../install/MB86H61/lib/M-arm11-gnuarm/libjpeg_encoder.a: could not read symbols: Archive has no index; run ranlib to add one"

Как-нибудь можно руками проверить есть там индекс или нет?...

Добавлено через 18 минут
Вот что обнаружил:
Архиватор только добавляет свой заголовок "!<arch>jpeg_encoder.o/ 1373953104 0 0 100666 962812 `" и все, дальше идет скопированный ошник. mc из линукса не читает такой формат.
Взял для примера либу которая нормально работает: там в начале перечислены названия экспортируемых функций и mc нормально все читает.

Что-то не то с работой архиватора..

Добавлено через 5 минут
Вызывается с ключами cvrs
По verbose выдает строку "r - K:\\build\\MB86H61\\M-arm11-gnuarm\\jpeg_encoder.o" - как это понимать?

Добавлено через 1 час 48 минут
Да, кстати залез в объектные файлы: те, которые нормальные (другие модули) имеют структуру elf-файлов (в начале файла идет "ELF..."), а jpeg_encoder.o начинается с "gpch+013..."
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16843 / 5264 / 323
Регистрация: 30.03.2009
Сообщений: 14,159
Записей в блоге: 26
16.07.2013, 12:01     Линковка плюсового кода #11
Цитата Сообщение от tiger() Посмотреть сообщение
HEADERS переменная есть в готовых makefiles, я когда по аналогии делал тоже вписал, но она не пригодилась, правда, можно убрать
HEADERS в Makefile'ах упоминают для указания зависимостей. Т.е. если был модифицирован *.h файл, то надо перекомпилировать *.c файл

Цитата Сообщение от tiger() Посмотреть сообщение
Про ar - ага, понял. Кстати. А тогда может и необязательно архивировать этот один .o в .a?
Необязательно. Можно линковаться с *.o файлом напрямую

Цитата Сообщение от tiger() Посмотреть сообщение
Мне нужно слинковать в один исполняемый файл ряд .o от gcc (+ряд библиотек) вместе с ОДНИМ .o от g++. Или он так просто к сишным объектникам не прилинкуется?
В объектном файле нет никаких понятий "язык программирования". Там есть просто символьная таблица и всё. Грубо говоря, в одном файле есть метка с именем "printf", в другом есть использование метки с именем "printf" эти две точки линкер сшивает и ему плевать на язык программирования.

Проблема с файлами С++ в том, что все имена мнглируются (портятся). Связано это с тем, что в языке допустимы несколько функций с одним именем, но разным прототипом. А потому прототип также кодируется в имени. Для того и существует директива extern "C", чтобы не манглировать имена (т.е. в символьную таблицу они попадут в том же виде, как если бы вылезли из-под компилятора Си)

Цитата Сообщение от tiger() Посмотреть сообщение
Присоединил в аттач исходную либу после компиляции (libjpeg_encoder.a) и такую, которая после ranlib-а получилась (post_libjpeg_encoder.a)
Линуксовые утилиты не захотели их жрать. В теории их можно руками пересобрать, чтобы включить поддержку виндузового формата файлов, но как-то неохота с этим разбираться, как их собирать

Цитата Сообщение от tiger() Посмотреть сообщение
Как-нибудь можно руками проверить есть там индекс или нет?...
Дык линкер же русским языком пишет, что символьной таблицы нету

Цитата Сообщение от tiger() Посмотреть сообщение
Архиватор только добавляет свой заголовок "!<arch>jpeg_encoder.o/ 1373953104 0 0 100666 962812 `" и все, дальше идет скопированный ошник. mc из линукса не читает такой формат.
Взял для примера либу которая нормально работает: там в начале перечислены названия экспортируемых функций и mc нормально все читает.
mc под линуксом вовнутрь твоих *.a файлов заходит. Если запустить "ar -t libjpeg_encoder.a", то список объектников выдаётся. Т.е. сам по себе архив нормальный. Но в нём нет специального файла, который трактуется как символьная таблица

Цитата Сообщение от tiger() Посмотреть сообщение
Что-то не то с работой архиватора..
В задачу архиватора НЕ входит создавать псевдофайл с символьной таблицей. Хотя современные ar'ы это делают. Тот факт, что у тебя ни ar, ни ranlib таблицу не приклеивают, говорит о том, что у тебя binutils как-то криво собрались. Покажи, что arm-elf-ar.exe выдаёт в конце если подать опцию --help (там список поддерживаемых форматов). Вероятнее всего твой ar умеет работать только с elf'ом, в то время как объектный файл - не elf. Такой файл сгенерировал ассемблер, возможно, его можно заставить генерировать elf по опции
tiger()
3 / 3 / 0
Регистрация: 20.04.2011
Сообщений: 141
16.07.2013, 12:48  [ТС]     Линковка плюсового кода #12
Получается генерятся объектные файлы .o не ELF-формата как надо, а какого-то gpch.
Но как можно настроить компил на ELF-object? В параметрах у него актой опции нет, тока имя выходного файла...

Добавлено через 6 минут
Цитата Сообщение от Evg Посмотреть сообщение
В задачу архиватора НЕ входит создавать псевдофайл с символьной таблицей. Хотя современные ar'ы это делают. Тот факт, что у тебя ни ar, ни ranlib таблицу не приклеивают, говорит о том, что у тебя binutils как-то криво собрались. Покажи, что arm-elf-ar.exe выдаёт в конце если подать опцию --help (там список поддерживаемых форматов). Вероятнее всего твой ar умеет работать только с elf'ом, в то время как объектный файл - не elf. Такой файл сгенерировал ассемблер, возможно, его можно заставить генерировать elf по опции
Ага, я тоже сильно подозреваю то что проблема во входном .o файле.
Кстати, у ar есть опция "работать как ranlib" и она включена.

Код
Usage: C:\Program Files\Fujitsu H61-series GCC Toolchain\bin\arm-elf-ar.exe [emu
lation options] [-]{dmpqrstx}[abcfilNoPsSuvV] [member-name] [count] archive-file
 file...
       C:\Program Files\Fujitsu H61-series GCC Toolchain\bin\arm-elf-ar.exe -M [
<mri-script]
 commands:
  d            - delete file(s) from the archive
  m[ab]        - move file(s) in the archive
  p            - print file(s) found in the archive
  q[f]         - quick append file(s) to the archive
  r[ab][f][u]  - replace existing or insert new file(s) into the archive
  s            - act as ranlib
  t            - display contents of archive
  x[o]         - extract file(s) from the archive
 command specific modifiers:
  [a]          - put file(s) after [member-name]
  [b]          - put file(s) before [member-name] (same as [i])
  [D]          - use zero for timestamps and uids/gids
  [N]          - use instance [count] of name
  [f]          - truncate inserted file names
  [P]          - use full path names when matching
  [o]          - preserve original dates
  [u]          - only replace files that are newer than current archive contents

 generic modifiers:
  [c]          - do not warn if the library had to be created
  [s]          - create an archive index (cf. ranlib)
  [S]          - do not build a symbol table
  [T]          - make a thin archive
  [v]          - be verbose
  [V]          - display the version number
  @<file>      - read options from <file>
 emulation options:
  No emulation specific options
C:\Program Files\Fujitsu H61-series GCC Toolchain\bin\arm-elf-ar.exe: supported
targets: elf32-littlearm elf32-bigarm elf32-little elf32-big srec symbolsrec ver
ilog tekhex binary ihex
Report bugs to <http://www.sourceware.org/bugzilla/>
Сейчас как раз пробую заставить g++ делать elf-объектник, но у него таких входных параметров нет. Вот его возможности:
Код
Usage: arm-elf-g++.exe [options] file...
Options:
  -pass-exit-codes         Exit with highest error code from a phase
  --help                   Display this information
  --target-help            Display target specific command line options
  --help={target|optimizers|warnings|params|[^]{joined|separate|undocumented}}[,
...]
                           Display specific types of command line options
  (Use '-v --help' to display command line options of sub-processes)
  --version                Display compiler version information
  -dumpspecs               Display all of the built in spec strings
  -dumpversion             Display the version of the compiler
  -dumpmachine             Display the compiler's target processor
  -print-search-dirs       Display the directories in the compiler's search path

  -print-libgcc-file-name  Display the name of the compiler's companion library
  -print-file-name=<lib>   Display the full path to library <lib>
  -print-prog-name=<prog>  Display the full path to compiler component <prog>
  -print-multi-directory   Display the root directory for versions of libgcc
  -print-multi-lib         Display the mapping between command line options and
                           multiple library search directories
  -print-multi-os-directory Display the relative path to OS libraries
  -print-sysroot           Display the target libraries directory
  -print-sysroot-headers-suffix Display the sysroot suffix used to find headers
  -Wa,<options>            Pass comma-separated <options> on to the assembler
  -Wp,<options>            Pass comma-separated <options> on to the preprocessor

  -Wl,<options>            Pass comma-separated <options> on to the linker
  -Xassembler <arg>        Pass <arg> on to the assembler
  -Xpreprocessor <arg>     Pass <arg> on to the preprocessor
  -Xlinker <arg>           Pass <arg> on to the linker
  -combine                 Pass multiple source files to compiler at once
  -save-temps              Do not delete intermediate files
  -pipe                    Use pipes rather than intermediate files
  -time                    Time the execution of each subprocess
  -specs=<file>            Override built-in specs with the contents of <file>
  -std=<standard>          Assume that the input sources are for <standard>
  --sysroot=<directory>    Use <directory> as the root directory for headers
                           and libraries
  -B <directory>           Add <directory> to the compiler's search paths
  -b <machine>             Run gcc for target <machine>, if installed
  -V <version>             Run gcc version number <version>, if installed
  -v                       Display the programs invoked by the compiler
  -###                     Like -v but options quoted and commands not executed
  -E                       Preprocess only; do not compile, assemble or link
  -S                       Compile only; do not assemble or link
  -c                       Compile and assemble, but do not link
  -o <file>                Place the output into <file>
  -x <language>            Specify the language of the following input files
                           Permissible languages include: c c++ assembler none
                           'none' means revert to the default behavior of
                           guessing the language based on the file's extension

Options starting with -g, -f, -m, -O, -W, or --param are automatically
 passed on to the various sub-processes invoked by arm-elf-g++.exe.  In order to
 pass
 other options on to these processes the -W<letter> options must be used.

For bug reporting instructions, please see:
<http://gcc.gnu.org/bugs.html>.
А может такое быть что изначально этот компилятор g++.exe настроен на генерацию не-elf-объектных так, что его не перенастроить?

Добавлено через 20 минут
Возможности ассемблера (as.exe):

Код
Usage: C:\Program Files\Fujitsu H61-series GCC Toolchain\arm-elf\bin\as.exe [opt
ion...] [asmfile...]
Options:
  -a[sub-option...]       turn on listings
                          Sub-options [default hls]:
                          c      omit false conditionals
                          d      omit debugging directives
                          g      include general info
                          h      include high-level source
                          l      include assembly
                          m      include macro expansions
                          n      omit forms processing
                          s      include symbols
                          =FILE  list to FILE (must be last sub-option)
  --alternate             initially turn on alternate macro syntax
  -D                      produce assembler debugging messages
  --debug-prefix-map OLD=NEW
                          map OLD to NEW in debug information
  --defsym SYM=VAL        define symbol SYM to given value
  --execstack             require executable stack for this object
  --noexecstack           don't require executable stack for this object
  --size-check=[error|warning]
                          ELF .size directive check (default --size-check=error)

  -f                      skip whitespace and comment preprocessing
  -g --gen-debug          generate debugging information
  --gstabs                generate STABS debugging information
  --gstabs+               generate STABS debug info with GNU extensions
  --gdwarf-2              generate DWARF2 debugging information
  --hash-size=<value>     set the hash table size close to <value>
  --help                  show this message and exit
  --target-help           show target specific options
  -I DIR                  add DIR to search list for .include directives
  -J                      don't warn about signed overflow
  -K                      warn when differences altered for long displacements
  -L,--keep-locals        keep local symbols (e.g. starting with `L')
  -M,--mri                assemble in MRI compatibility mode
  --MD FILE               write dependency information in FILE (default none)
  -nocpp                  ignored
  -o OBJFILE              name the object-file output OBJFILE (default a.out)
  -R                      fold data section into text section
  --reduce-memory-overheads
                          prefer smaller memory use at the cost of longer
                          assembly times
  --statistics            print various measured statistics from execution
  --strip-local-absolute  strip local absolute symbols
  --traditional-format    Use same format as native assembler when possible
  --version               print assembler version number and exit
  -W  --no-warn           suppress warnings
  --warn                  don't suppress warnings
  --fatal-warnings        treat warnings as errors
  -w                      ignored
  -X                      ignored
  -Z                      generate object file even after errors
  --listing-lhs-width     set the width in words of the output data column of
                          the listing
  --listing-lhs-width2    set the width in words of the continuation lines
                          of the output data column; ignored if smaller than
                          the width of the first line
  --listing-rhs-width     set the max width in characters of the lines from
                          the source file
  --listing-cont-lines    set the maximum number of continuation lines used
                          for the output data column of the listing
  @FILE                   read options from FILE
 ARM-specific assembler options:
  -k                      generate PIC code
  -mthumb                 assemble Thumb code
  -mthumb-interwork       support ARM/Thumb interworking
  -mapcs-32               code uses 32-bit program counter
  -mapcs-26               code uses 26-bit program counter
  -mapcs-float            floating point args are in fp regs
  -mapcs-reentrant        re-entrant code
  -matpcs                 code is ATPCS conformant
  -mbig-endian            assemble for big-endian
  -mlittle-endian         assemble for little-endian
  -mapcs-frame            use frame pointer
  -mapcs-stack-check      use stack size checking
  -mno-warn-deprecated    do not warn on use of deprecated feature
  -mcpu=<cpu name>        assemble for CPU <cpu name>
  -march=<arch name>      assemble for architecture <arch name>
  -mfpu=<fpu name>        assemble for FPU architecture <fpu name>
  -mfloat-abi=<abi>       assemble for floating point ABI <abi>
  -meabi=<ver>            assemble for eabi version <ver>
  -mimplicit-it=<mode>    controls implicit insertion of IT instructions
  -EB                     assemble code for a big-endian cpu
  -EL                     assemble code for a little-endian cpu
  --fix-v4bx              Allow BX in ARMv4 code

Report bugs to <http://www.sourceware.org/bugzilla/>
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16843 / 5264 / 323
Регистрация: 30.03.2009
Сообщений: 14,159
Записей в блоге: 26
16.07.2013, 18:27     Линковка плюсового кода #13
Цитата Сообщение от tiger() Посмотреть сообщение
Сейчас как раз пробую заставить g++ делать elf-объектник, но у него таких входных параметров нет
Объектный файл формирует ассемблер, а не компилятор. Если в запуск gcc/g++ подашь опцию -v, то увидишь, что из-под себя запускает gcc (в конечном итоге будет вызов ассемблера)

Для самообразования можешь почитать тут Процесс компиляции, но вроде бы как базовые понятия ты и так знаешь

Как заставить as генерить elf - хз. Даже глядя на описание intel'овского as'а я не вижу никаких опций.

Конкретно в твоём случае предлагаю для начала забить на библиотеки *.a и линковаться напрямую с файлом jpeg_encoder.o. Т.е. сначала пойти по такому пути, поскольку проблему ar'а (которая растёт из проблемы as'а) пока понятно, как обходить. Когда все проблемы решишь, можно вернуться к ассемблеру

Добавлено через 5 минут
Меня смущает программа под именем arm-elf-as, которая генерирует не elf. А ты toolchain сам собирал или готовый скачал?

Добавлено через 1 минуту
Кстати, чтобы gcc тебе выдал полный help, то нужно подавать две опции: "gcc -v --help"
tiger()
3 / 3 / 0
Регистрация: 20.04.2011
Сообщений: 141
17.07.2013, 08:06  [ТС]     Линковка плюсового кода #14
Цитата Сообщение от Evg Посмотреть сообщение
Конкретно в твоём случае предлагаю для начала забить на библиотеки *.a и линковаться напрямую с файлом jpeg_encoder.o. Т.е. сначала пойти по такому пути, поскольку проблему ar'а (которая растёт из проблемы as'а) пока понятно, как обходить. Когда все проблемы решишь, можно вернуться к ассемблеру
Очень не уверен что это получится, т.к. мой объектник не такого формата как надо. Если бы он был elf, то и либа бы нормально собралась. А все остальные .o-ники в проекте эльфовые, подозреваю что надо именно такой. Но я попробую.

Цитата Сообщение от Evg Посмотреть сообщение
Меня смущает программа под именем arm-elf-as, которая генерирует не elf. А ты toolchain сам собирал или готовый скачал?
Тоже.
Это был готовый toolchain от производителя, вместе с отладочной платой доставили. Задал им вопрос на эту тему, может быть тут принципиальная невозможность присутствует.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16843 / 5264 / 323
Регистрация: 30.03.2009
Сообщений: 14,159
Записей в блоге: 26
17.07.2013, 11:06     Линковка плюсового кода #15
Цитата Сообщение от tiger() Посмотреть сообщение
Очень не уверен что это получится, т.к. мой объектник не такого формата как надо. Если бы он был elf, то и либа бы нормально собралась. А все остальные .o-ники в проекте эльфовые, подозреваю что надо именно такой
Чегой-то я не понимаю. У тебя половина объектников собраны одним компилятором, половина другим?
tiger()
3 / 3 / 0
Регистрация: 20.04.2011
Сообщений: 141
17.07.2013, 13:17  [ТС]     Линковка плюсового кода #16
Цитата Сообщение от Evg Посмотреть сообщение
Чегой-то я не понимаю. У тебя половина объектников собраны одним компилятором, половина другим?
Да, плюсовый код g++, остальной gcc. Все целиком g++-ом не собиралось.
Я по ходу понял в чем проблема была.
Получается что формат elf на выходе генерится эльфовыми компиляторами (такими как например мои с префиксом arm-elf-): gcc делает из .c файла, g++ из .cpp файла. Но g++ не делает такой файл из .c файла. Неужели он сам не может определить язык, если указано просто .c ...

Добавлено через 1 час 45 минут
Так, вопрос перешел в другую форму. Я в отдельной теме сделал. Вот здесь.
Evg, огромное спасибо за ваши комментарии! Особенно за познавательные ссылки и заметки "не по теме".
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16843 / 5264 / 323
Регистрация: 30.03.2009
Сообщений: 14,159
Записей в блоге: 26
17.07.2013, 14:59     Линковка плюсового кода #17
Я так понимаю, что в этой теме всё?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.07.2013, 15:37     Линковка плюсового кода
Еще ссылки по теме:

C++ Статическая линковка boost
C++ Статическая линковка
C++ Статическая линковка MinGW

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
tiger()
3 / 3 / 0
Регистрация: 20.04.2011
Сообщений: 141
17.07.2013, 15:37  [ТС]     Линковка плюсового кода #18
Цитата Сообщение от Evg Посмотреть сообщение
Я так понимаю, что в этой теме всё?
Думаю да, библиотека скомпилировалась. Осталось ее заюзать правильно )
Yandex
Объявления
17.07.2013, 15:37     Линковка плюсового кода
Ответ Создать тему
Опции темы

Текущее время: 06:36. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru