Результаты поиска
Как исправить ошибку "for loop initial declaration used outside C99 mode" GCC?
Я пытаюсь решить проблему 3n+1 , и у меня есть цикл for , который выглядит следующим образом:
for(int i = low; i <= high; ++i)
{
res = runalg(i);
if (res > highestres)
{
highestres = res;
}
}
К сожалению, я получаю эту ошибку, когда пытаюсь скомпилировать с GCC:
3np1.c:15: ошибка: 'for' начальный цикл объявление, используемое вне режима C99
Я не знаю, что такое режим C99. Есть какие-нибудь идеи?
Нарушается ли GCC при приеме адреса аргумента на ARM7TDMI?
Фрагмент кода My C принимает адрес аргумента и сохраняет его в энергонезависимой памяти (предварительно обработанный код):
void foo(unsigned int x) {
*(volatile unsigned int*)(0x4000000 + 0xd4) = (unsigned int)(&x);
}
int main() {
foo(1);
while(1);
}
Я использовал SVN версию GCC для компиляции этого кода. В конце функции foo я ожидал бы, что значение 1 будет сохранено в стеке, а в 0x40000d4-адрес , указывающий на это значение. Когда я компилирую без оптимизации, используя флаг -O0, я получаю ожидаемый выход ARM7TMDI assembly (прокомментированный для вашего удобства):
.align 2
.global foo
.type foo, %function
foo:
@ Function supports interworking.
@ args = 0, pretend = 0, frame = 8
@ frame_needed = 0, uses_anonymous_args = 0
@ link register save eliminated.
sub sp, sp, #8
str r0, [sp, #4] @ 3. Store the argument on the stack
mov r3, #67108864
add r3, r3, #212
add r2, sp, #4 @ 4. Address of the stack variable
str r2, [r3, #0] @ 5. Store the address at 0x40000d4
add sp, sp, #8
bx lr
.size foo, .-foo
.align 2
.global main
.type main, %function
main:
@ Function supports interworking.
@ args = 0, pretend = 0, frame = 0
@ frame_needed = 0, uses_anonymous_args = 0
stmfd sp!, {r4, lr}
mov r0, #1 @ 1. Pass the argument in register 0
bl foo @ 2. Call function foo
.L4:
b .L4
.size main, .-main
.ident "GCC: (GNU) 4.4.0 20080820 (experimental)"
Он четко сохраняет аргумент сначала в стеке, а оттуда сохраняет его в 0x40000d4 . Когда я компилирую с оптимизациями, используя -O1 , я получаю что-то неожиданное:
.align 2
.global foo
.type foo, %function
foo:
@ Function supports interworking.
@ args = 0, pretend = 0, frame = 8
@ frame_needed = 0, uses_anonymous_args = 0
@ link register save eliminated.
sub sp, sp, #8
mov r2, #67108864
add r3, sp, #4 @ 3. Address of *something* on the stack
str r3, [r2, #212] @ 4. Store the address at 0x40000d4
add sp, sp, #8
bx lr
.size foo, .-foo
.align 2
.global main
.type main, %function
main:
@ Function supports interworking.
@ args = 0, pretend = 0, frame = 0
@ frame_needed = 0, uses_anonymous_args = 0
stmfd sp!, {r4, lr}
mov r0, #1 @ 1. Pass the argument in register 0
bl foo @ 2. Call function foo
.L4:
b .L4
.size main, .-main
.ident "GCC: (GNU) 4.4.0 20080820 (experimental)"
На этот раз аргумент никогда не сохраняется в стеке, даже если что- то из стека все еще хранится в 0x40000d4 .
Это просто ожидаемое / неопределенное поведение? Я сделал что-то не так или действительно нашел компилятор Bug™?
CMake и статическая линковка
Есть небольшая самописная кроссплатформенная игрушка использующая SDL. Язык C++. Под Win32 и Win64 собирается в mingw-w64, gcc 4.5.1.
Хочется следующего: в сборках под Windows линковать зависимости статически. Не охота таскать за собой добрый десяток библиотек. Сейчас в среде сборки есть оба варианта библиотек: для статической и динамической линковки. По умолчанию gcc предпочитает линковать динамически. Для того, чтобы он выбирал статические версии библиотек требуется добавлять перед ними ключ -static. Причём потом требуется перед библиотеками, которые линкуются динамически (OpenGL), добавить ключ -dynamic.
Вопрос: как заставить/научить cmake собирать нужную командную строку?
Возможно ли сделать объектно-ориентированное API через DLL (GCC, C++)?
Добрый день.
Вопрос следующий — пусть есть абстрактное приложение, к которому хочется добавить некоторое API для плагинов. Плагины скорее всего будут представлять собой DLL'ки, которые динамически подгружаются основным кодом.
В Java можно сделать интерфейс IPlugin, а в плагине расширить его: public class MySuperPlugin implements IPlugin, после чего спокойно подгружать тысячи классов по именам. Можно ли сделать что-то похожее в C++? Я знаю, что можно спокойно подгружать обычные функции (не члены класса) из DLL. Пока придумались только такие костыли: делаем много функций «переходников», каждая из которых вызывает соответствующий член класс. Но это ужас.
Как решить? Ведь, наверное, можно.
Qt4 не видит функцию в динамической библиотеке, хотя саму библиотеку подключает?
Собрал динамическую библиотеку libbozorth3. В ней определена функция bozorth_main(xyt_struct*, xyt_struct*)
Проверил на тестовом исходнике, собрал с помощью gcc, все скомпилилось, функция отработала нормально.
Но вот когда я подключаю эту же библиотеку к Qt4 (в Qt Creator'е), то gcc ее видит (иначе бы ругался, что библиотека не найдена), но не видит эту функцию (хотя я просто скопировал код из тестового исходника в мой проект). В чем может быть проблема и как исправить? Почему один и тот же gcc в первом случае собирает нормально, а вот вместе с qt4 не находит функцию?
robotex@robotex-laptop ~/workspace/qt_fprint-build-desktop $ gcc -o qt_fprint main.o
mainwindow.o cfingerprintscanner.o cfingerprintdata.o moc_mainwindow.o moc_cfingerprintscanner.o
-lfprint -lQtGui -lQtCore -lpthread -lbozorth3cfingerprintscanner.o:
In function `CFingerprintScanner::comparePrintData(CFingerprintData,
CFingerprintData)':
/home/robotex/workspace/qt_fprint-build-desktop/../qt_fprint/cfingerprintscanner.cpp:475: undefined
reference to `bozorth_main(xyt_struct*, xyt_struct*)'
collect2: ld returned 1 exit status
robotex@robotex-laptop ~/workspace/qt_fprint-build-desktop $ gcc -o qt_fprint main.o
mainwindow.o cfingerprintscanner.o cfingerprintdata.o moc_mainwindow.o moc_cfingerprintscanner.o
-lfprint -lQtGui -lQtCore -lpthread -lbozorth3cfingerprintscanner.o:
In function `CFingerprintScanner::comparePrintData(CFingerprintData,
CFingerprintData)':
/home/robotex/workspace/qt_fprint-build-desktop/../qt_fprint/cfingerprintscanner.cpp:475: undefined
reference to `bozorth_main(xyt_struct*, xyt_struct*)'
collect2: ld returned 1 exit status