Понадобилась функция, делающая скриншот в программе и сохраняющая его в файл. Я нашёл несколько таких функций, но каждая (!) из них при добавлении в программу заставляет её выдавать при компиляции вот такую ошибку:
C:{папка_с_файлом.cpp}collect2.exe [Error] ld returned 1 exit status
Причём других ошибок нет, или я их исправляю. Обычно такая ошибка происходит, когда у меня код уже скомпилирован и запущен .exe, и я пытаюсь ещё раз его скомпилировать и запустить. Но, разумеется, я всё перепробовал, даже запускал код на другом компе (но тоже в Dev) — такая же ошибка.
Если убрать эту функцию, то код снова нормально работает. Подскажите, что делать?
Вот текущий код с одним из вариантов функции, делающий скриншот:
#include <Winsock2.h>//Ws2_32.lib
#include <ws2tcpip.h>
#include <Windows.h>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h> //getch
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/time.h>
//#include <sys/socket.h>
#define ever (;;)
#include <gdiplus.h>
#pragma comment(lib, "GdiPlus.lib")
//Тут всякий другой код. Вообще, программа для работы с сетью (это клиент).
//Но она даже не запускается, выдаёт ту ошибку.
using namespace std;
using namespace Gdiplus;
static const GUID png =
{ 0x557cf406, 0x1a04, 0x11d3, { 0x9a, 0x73, 0x00, 0x00, 0xf8, 0x1e, 0xf3, 0x2e } };
int PrtScr()
{
GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
HDC scrdc, memdc;
HBITMAP membit;
scrdc = GetDC(0);
int Height, Width;
Height = GetSystemMetrics(SM_CYSCREEN);
Width = GetSystemMetrics(SM_CXSCREEN);
memdc = CreateCompatibleDC(scrdc);
membit = CreateCompatibleBitmap(scrdc, Width, Height);
SelectObject(memdc, membit);
BitBlt(memdc, 0, 0, Width, Height, scrdc, 0, 0, SRCCOPY);
HBITMAP hBitmap;
hBitmap =(HBITMAP) SelectObject(memdc, membit);
Gdiplus::Bitmap bitmap(hBitmap, NULL);
char PerMin[12];
strcpy (PerMin,"screen.png" );
bitmap.Save((WCHAR*)PerMin, &png,NULL);
DeleteObject(hBitmap);
return 0;
}
/////////////////////////////////////////////////////
int main()
{
printf ("OK1n");
getch();
PrtScr();
printf ("OK2n");
getch();
//Тут всякий иной код
return 0;
}
-
#1
Marlin 2.0.8, COREXY, 3D TOUCH
все работало нормально. Не знаю, что сделал ,но ошибка при компиляции вылезает не зависимо от
-компа
-смены прошивки вплоть до чистой или родной заводской
-перезагрузки компа
-удаления полного VC и установки заново
В общем, мумукаюсь уже два дня, начинаю беситься.
Наверняка кто-то тоже сталкивался с такой проблемой, отзовитесь.
Прошивку прицепил.
-
116.7 KB
Просмотры: 2
-
#3
да, думал, что конфига хватит, минуту…
03-05.7z
Посмотреть и скачать с Яндекс.Диска
disk.yandex.ru
может это поможет.
-
#4
Там пишет, что rom имеет переполнение на 660 байт.
Кроме того, 30 предупреждений, которые не решены.
-
#5
я не программист, от слова Далеко, извините. Что я должен сделать с этим ромом? ну, и с предупреждениями?
Спасибо.
предупреждения и раньше были (это желтым, я понимаю), может не столько, как сейчас, но все работало. Вот начал автоуровень приделывать и кое что подкорректировал в прошиве, может и не туда ткнул где-то…
попробую вот так
-
#6
ссылку на прошивку вы не видите до сих пор?
Нет.
Да и помочь вряд ли смогу.
Мне сама железка нужна, что бы понять.
-
#7
если под железкой понимается комп, то я делал на другом компе и тоже самое происходит
достал старую прошивку, предупреждений нет, переполнения ром тоже нет, но появилось новое чего то там в файле .ld
-
#8
А обновления PlatformIO перед этим не было?
Я столкнулся с тем, что писал на старом, на компе, где нет интернета. И всё работало.
Дома обновился и всё перестало работать.
А почему не пишете под CubeIDE?
А судя по логу, ему скрипт для F103VC не нравится.
-
#9
я сносил два раза VC полностью и устанавливал, но вроде не писал мне VC что обновляет Платформио.
А почему не пишете под CubeIDE?\ я даже не знаю, что это, я далек от понимания языка С и пр. Просто обновил плату на 32 бит, за ней потянулся Марлин 2.0, ну и далее вопрос чем компилить, увидел VC и вперед.
А судя по логу, ему скрипт для F103VC не нравится…\ ну это «вдруг» сейчас ему не нравится, а всегда нравился, вроде.
ааааа, со старой прошивой сам баран — перенес ее в новую папку и обозвал кирилицей папку АРХИВ… блин, сам на эти грабли уже наступал… Так вот, когда АРХИВ переименовал в STORAGE, то все скомпилировалось!! Таакс, значит дело не в VC. Надо, наверное, сравнить построчно обе прошивы и найти разницу, в этой разнице и кроется ошибка или опять же русская буква закралась в команду…
-
#10
Вот про эту возможность я всегда забываю. Так как никогда ни пользователя, ни каталог для проекта не создаю кириллицей.
И в логах ошибки ничего не было. Поэтому и забыл.
А сравнивать построчно удобно TotalCommander. Файловый менеджер с кучей фич в максимальной комплектации.
-
#11
Эдуард, БОЛЬШОЕ СПАСИБО!!
I tried to search for that bug online, but all the posts are for C++.
This is the message:
test1.o: In function `ReadDictionary':
/home/johnny/Desktop/haggai/test1.c:13: undefined reference to `CreateDictionary'
collect2: error: ld returned 1 exit status
make: *** [test1] Error 1
It is super simple code, and I can’t understand what the problem is:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "dict.h"
#include "hash.h"
pHash ReadDictionary() {
/* This function reads a dictionary line by line from the standard input. */
pHash dictionary;
char entryLine[100] = "";
char *word, *translation;
dictionary = CreateDictionary();
while (scanf("%s", entryLine) == 1) { // Not EOF
word = strtok(entryLine, "=");
translation = strtok(NULL, "=");
AddTranslation(dictionary, word, translation);
}
return dictionary;
}
int main() {
pHash dicti;
...
Now this is the header file dict.h:
#ifndef _DICT_H_
#define _DICT_H_
#include "hash.h"
pHash CreateDictionary();
...
#endif
And here is the dict.c file:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "hash.h"
#include "dict.h"
pHash CreateDectionary()
{
pHash newDict;
newDict = HashCreate(650, HashWord, PrintEntry, CompareWords, GetEntryKey, DestroyEntry);
return newDict;
}
And if you want to check file hash.h:
#ifndef _HASH_H_
#define _HASH_H_
// Type definitions //
typedef enum {FAIL = 0, SUCCESS} Result;
typedef enum {SAME = 0, DIFFERENT} CompResult;
typedef struct _Hash Hash, *pHash;
typedef void* pElement;
typedef void* pKey;
// Function types //
typedef int (*HashFunc) (pKey key, int size);
typedef Result (*PrintFunc) (pElement element);
typedef CompResult (*CompareFunc) (pKey key1, pKey key2);
typedef pKey (*GetKeyFunc) (pElement element);
typedef void (*DestroyFunc)(pElement element);
...
// Interface functions //
#endif
Maybe it will be easier if I give you the files here?
Anyway, I will be happy for tips on how to understand the problem.
I tried to search for that bug online, but all the posts are for C++.
This is the message:
test1.o: In function `ReadDictionary':
/home/johnny/Desktop/haggai/test1.c:13: undefined reference to `CreateDictionary'
collect2: error: ld returned 1 exit status
make: *** [test1] Error 1
It is super simple code, and I can’t understand what the problem is:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "dict.h"
#include "hash.h"
pHash ReadDictionary() {
/* This function reads a dictionary line by line from the standard input. */
pHash dictionary;
char entryLine[100] = "";
char *word, *translation;
dictionary = CreateDictionary();
while (scanf("%s", entryLine) == 1) { // Not EOF
word = strtok(entryLine, "=");
translation = strtok(NULL, "=");
AddTranslation(dictionary, word, translation);
}
return dictionary;
}
int main() {
pHash dicti;
...
Now this is the header file dict.h:
#ifndef _DICT_H_
#define _DICT_H_
#include "hash.h"
pHash CreateDictionary();
...
#endif
And here is the dict.c file:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "hash.h"
#include "dict.h"
pHash CreateDectionary()
{
pHash newDict;
newDict = HashCreate(650, HashWord, PrintEntry, CompareWords, GetEntryKey, DestroyEntry);
return newDict;
}
And if you want to check file hash.h:
#ifndef _HASH_H_
#define _HASH_H_
// Type definitions //
typedef enum {FAIL = 0, SUCCESS} Result;
typedef enum {SAME = 0, DIFFERENT} CompResult;
typedef struct _Hash Hash, *pHash;
typedef void* pElement;
typedef void* pKey;
// Function types //
typedef int (*HashFunc) (pKey key, int size);
typedef Result (*PrintFunc) (pElement element);
typedef CompResult (*CompareFunc) (pKey key1, pKey key2);
typedef pKey (*GetKeyFunc) (pElement element);
typedef void (*DestroyFunc)(pElement element);
...
// Interface functions //
#endif
Maybe it will be easier if I give you the files here?
Anyway, I will be happy for tips on how to understand the problem.
vitalya199529 0 / 0 / 1 Регистрация: 12.02.2013 Сообщений: 21 |
||||
1 |
||||
13.11.2013, 14:14. Показов 49089. Ответов 14 Метки нет (Все метки)
господа программисты, объясните мне в чем тут дело, я решил поиграться со счетчиком строк, но вот что то он не запускается
ошибка я видел тему на счет этой ошибки на форуме но внятного решения проблемы так и не увидел
__________________
0 |
castaway 4978 / 3085 / 456 Регистрация: 10.11.2010 Сообщений: 11,164 Записей в блоге: 10 |
||||
13.11.2013, 14:15 |
2 |
|||
Тут, и везде в остальном коде не кавычки должны быть, а два знака <
0 |
vitalya199529 0 / 0 / 1 Регистрация: 12.02.2013 Сообщений: 21 |
||||
13.11.2013, 14:17 [ТС] |
3 |
|||
Тут, и везде в коде не кавычки должны быть, а два знака <
ну так это и есть два знака << просто при копировании кода из devc++ они заменились на «
0 |
4978 / 3085 / 456 Регистрация: 10.11.2010 Сообщений: 11,164 Записей в блоге: 10 |
|
13.11.2013, 14:19 |
4 |
Ты букву Б на клавиатуре видишь?
0 |
0 / 0 / 1 Регистрация: 12.02.2013 Сообщений: 21 |
|
13.11.2013, 14:21 [ТС] |
5 |
так что дело не в этом, у меня да же при всем желании не получается поставить этот знак « только << так, так что ошибка не в этом Добавлено через 45 секунд
Ты букву Б на клавиатуре видишь? у меня да же при всем желании не получается поставить этот знак « только << так, так что ошибка не в этом
0 |
4978 / 3085 / 456 Регистрация: 10.11.2010 Сообщений: 11,164 Записей в блоге: 10 |
|
13.11.2013, 14:23 |
6 |
Ты в Microsoft Word программы пишешь?
0 |
vitalya199529 0 / 0 / 1 Регистрация: 12.02.2013 Сообщений: 21 |
||||
13.11.2013, 14:23 [ТС] |
7 |
|||
вот так вот у меня код записан в деве Добавлено через 22 секунды
Ты в Microsoft Word программы пишешь? Dev C++
0 |
4978 / 3085 / 456 Регистрация: 10.11.2010 Сообщений: 11,164 Записей в блоге: 10 |
|
13.11.2013, 14:25 |
8 |
В этой программе нет синтаксических ошибок. У меня она компилируется нормально.
0 |
0 / 0 / 1 Регистрация: 12.02.2013 Сообщений: 21 |
|
13.11.2013, 14:26 [ТС] |
9 |
я могу скрин кинуть, только скажите как это сделать))
0 |
Почетный модератор 5850 / 2861 / 392 Регистрация: 01.11.2011 Сообщений: 6,905 |
|
13.11.2013, 14:31 |
10 |
vitalya199529, перепишите код руками. Не копируйте. Руками. Это и полезно вам будет и ошибку устранит.
0 |
0 / 0 / 1 Регистрация: 12.02.2013 Сообщений: 21 |
|
13.11.2013, 14:37 [ТС] |
11 |
проблема решилась сама собой после 100500 попытки запуска все заработало)
0 |
0 / 0 / 0 Регистрация: 05.04.2014 Сообщений: 5 |
|
08.08.2015, 14:21 |
12 |
Надо в диспетчере задач убить процесс своей программы. и запускай
0 |
Don’t worry, be happy 17781 / 10545 / 2036 Регистрация: 27.09.2012 Сообщений: 26,516 Записей в блоге: 1 |
|
08.08.2015, 14:28 |
13 |
Надо в диспетчере задач убить процесс своей программы. и запускай Он за два года еще из цикла не вышел
4 |
castaway |
08.08.2015, 14:28
|
Не по теме:
Он за два года еще из цикла не вышел :D.
0 |
0 / 0 / 0 Регистрация: 05.08.2019 Сообщений: 3 |
|
05.08.2019, 22:17 |
15 |
Он просто консоль забыл вырубить и все
0 |
Я попытался найти эту ошибку онлайн, но все сообщения для С++.
Это сообщение:
test1.o: В функции
ReadDictionary':
CreateDictionary ‘ collect2: error: ld возвращен 1 статус выхода make: *** [test1] Ошибка 1
/home/johnny/Desktop/haggai/test1.c:13: undefined reference to
супер простой код и не может понять, что проблема
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "dict.h"
#include "hash.h"
pHash ReadDictionary() {
/* This function reads a dictionary line by line from the standard input. */
pHash dictionary;
char entryLine[100] = "";
char *word, *translation;
dictionary = CreateDictionary();
while (scanf("%s", entryLine) == 1) { // Not EOF
word = strtok(entryLine, "=");
translation = strtok(NULL, "=");
AddTranslation(dictionary, word, translation);
}
return dictionary;
}
int main() {
pHash dicti;
...
теперь это заголовок dict.h
#ifndef _DICT_H_
#define _DICT_H_
#include "hash.h"
pHash CreateDictionary();
...
#endif
и вот dict.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "hash.h"
#include "dict.h"
pHash CreateDectionary()
{
pHash newDict;
newDict= HashCreate(650, HashWord, PrintEntry, CompareWords, GetEntryKey, DestroyEntry);
return newDict;
}
и если вы хотите проверить hash.h
#ifndef _HASH_H_
#define _HASH_H_
//type defintions//
typedef enum {FAIL = 0, SUCCESS} Result;
typedef enum {SAME = 0, DIFFERENT} CompResult;
typedef struct _Hash Hash, *pHash;
typedef void* pElement;
typedef void* pKey;
//function types//
typedef int (*HashFunc) (pKey key, int size);
typedef Result (*PrintFunc) (pElement element);
typedef CompResult (*CompareFunc) (pKey key1, pKey key2);
typedef pKey (*GetKeyFunc) (pElement element);
typedef void (*DestroyFunc)(pElement element);
...
//interface functions//
#endif
Может быть, будет легче, если я дам вам файлы здесь?
В любом случае, я буду рад за советы о том, как понять проблему.
Ответ 1
Ваша проблема — это опечатка в функции CreateD e ctionary(). Вы должны изменить ее на CreateD i ctionary().
collect2: error: ld return 1 статус выхода — та же проблема как на C, так и на С++, обычно это означает, что у вас есть неразрешенные символы. В вашем случае это опечатка, о которой я упоминал ранее.
Ответ 2
установить это
sudo apt install libgl-dev libglu-dev libglib2.0-dev libsm-dev libxrender-dev libfontconfig1-dev libxext-dev
http://www.qtcentre.org/threads/69625-collect2-error-ld-returned-1-exit-status
Ответ 3
У меня возникла эта проблема, и я попытался решить многие ее проблемы. Наконец, оказалось, что make clean
и make
снова решили. Причина в следующем:
Я получил исходный код вместе с объектными файлами, скомпилированными ранее со старой версией gcc. Когда моя новая версия gcc хочет связать эти старые файлы объектов, она не может решить какую-либо функцию там. Случается со мной несколько раз, что дистрибуторы исходного кода не очищаются перед упаковкой, поэтому make clean
сохранил день.
Ответ 4
иногда эта ошибка возникла, потому что не удалось скомпилировать ни в какой другой сборке.
Лучший способ попробовать — сделать чистую и снова сделать весь код.
Ответ 5
При компиляции вашей программы вам необходимо включить dict.c, например:
gcc -o test1 test1.c dict.c
Кроме того, у вас есть опечатка в определении dict.c CreateDictionary
, она говорит CreateDectionary
(e
вместо i
)
Ответ 6
обычно эта проблема возникала, когда мы вызывали функцию, которая не была определена в программном файле, поэтому, чтобы решить эту проблему, проверьте, вызывали ли вы такую функцию, которая не была определена в файле программы.
Ответ 7
Если вы используете Dev C++, то ваш .exe
или означает, что ваша программа уже запущена, и вы пытаетесь запустить ее снова.
Ответ 8
- Перейдите в раздел «Дополнительные параметры системы» в свойствах компьютера.
- Нажмите «Дополнительно»
- Нажмите для переменной окружения
- Выберите вариант пути
- Измените параметр пути на папку bin dev c
- Применить и сохранить его
- Теперь сохраните код в папке bin в разработчике c
На чтение 4 мин. Просмотров 58 Опубликовано 15.12.2019
Понадобилась функция, делающая скриншот в программе и сохраняющая его в файл. Я нашёл несколько таких функций, но каждая (!) из них при добавлении в программу заставляет её выдавать при компиляции вот такую ошибку:
C:<папка_с_файлом.cpp>collect2.exe [Error] ld returned 1 exit status
Причём других ошибок нет, или я их исправляю. Обычно такая ошибка происходит, когда у меня код уже скомпилирован и запущен .exe, и я пытаюсь ещё раз его скомпилировать и запустить. Но, разумеется, я всё перепробовал, даже запускал код на другом компе (но тоже в Dev) — такая же ошибка.
Если убрать эту функцию, то код снова нормально работает. Подскажите, что делать?
Вот текущий код с одним из вариантов функции, делающий скриншот:
3 ответа 3
ld returned 1 exit status обычно означает, что у Вас в коде есть недопустимые символы. Они могут там быть даже если их вроде и не видно, например, русская буква е от английской e на первый взгляд ничем не отличается. Обычно это результат копипасты. Так как функция небольшая, то самый простой вариант для Вас решить проблему — переписать ее (вернее, всю копипасту) руками.
Update Так же, проблемой может быть неподключенная библиотека. Нужно посмотреть по списку подключенных заголовочных файлов, к каким библиотекам они относятся и в натсройках проекта добавить все отсутствующие библиотеки.
Проблемой может быть и какой-то неподключенный заголовочный файл. Тут надо смотреть по названиям используемых функций и искать заголовки, где они объявлены.
При неподключённой библиотеке или опечатке в определении метода линкер всегда указывает, какой именно метод неопределён. По его имени можно грепнуть, где он определяется и подлинковать либу.
Я столкнулся с такой же проблемой без какой-либо дополнительно информации от линкера, тоже долго чесал репу и искал опечатки, но в итоге заметил, что на диске, где собираюсь, мало места. Перенёс исходники на накопитель побольше — там сразу нормально слинковалось. Возможно, решение проблемы AlfredBauer’ом связано с тем же, т.к. 32-битные бинарники занимают меньше места.
В общем, при недостатке места на этапе линковки может выводиться подобное сообщение без поясняющей информации. Словил на CentOS 6.9, g++ 4.8.2, glibc 2.12.
For some reason, when I try compiling a program, the compiler says permission denied and Id returned 1 exit status. Could anyone tell me what that means? Thank you
The above is the binary search algorithm code I tried to compile.
11 Answers 11
I may guess, the old instance of your program is still running. Windows does not allow to change the files which are currently «in use» and your linker cannot write the new .exe on the top of the running one. Try stopping/killing your program.
I bet for sure, that this is because you didn’t close the running instance of the program before trying to re-compile it.
Generally, ld.exe returns 1 when it can’t access required files. This usually includes
- Can’t find the object file to be linked (or Access denied )
- Can’t find one or more symbols to link
- Can’t open the executable for writing (or AD)
The program looks completely fine, so the second point should not hit. In usual cases, it’s impossible for ld to fail to open the object file (unless you have a faulty drive and a dirty filesystem), so the first point is also nearly impossible.
Now we get to the third point. Note that Windows not allow writing to a file when it’s in use, so the running instance of your program prevents ld.exe from writing the new linked program to it.
So next time be sure to close running programs before compiling.
батник:
PATH=%PATH%;c:MinGWin
g++ -fopenmp test.cpp -o test.exe
pause
в чем проблема? при запуске выдает ошибку
collect2.exe: error: ld returned 1 exit status
- Вопрос задан более трёх лет назад
- 8377 просмотров
На довольно давней версии mingw, имевшейся у меня, получилось сделать вот так — запустив компилятор и линкер раздельно.
Заодно пришлось скачать pthreads для win32, по умолчанию библиотеки (*.a) есть, а dll нет.
И вообще, это зависит от сборки MinGW. На свежих сборках mingw-w64 — как с Win32-, так и с posix-потоками — всё заработало именно по-твоему. И pthreads нашёлся.
Ну и, конечно, ты не указал, ПОЧЕМУ линкер вышел с кодом 1. Но это я уже сам понял, поэкспериментировав.
Содержание
- Qt ошибка: collect2: error: ld returned 1 exit status
- CMake linking error (collect2: ld returned 1 exit status)
- 1 Answer 1
- linux assembly «collect2: ld returned 1 exit status»
- 1 Answer 1
- Using C Library/runtime
- Can’t compile C++ in Ubuntu using GCC — Include/Library Problems (collect2: ld returned 1 exit status)
- 3 Answers 3
- collect2: error: ld returned 1 exit status (-lcudnn)
- Edit 1
- Problem
- Description
- What I tried
- 2 Answers 2
Qt ошибка: collect2: error: ld returned 1 exit status
Kubuntu LTS 18.04 новая, Qt 5.11
Всем привет! Поставил новую Kubuntu и Qt, сделал новый проект, только с MainWindow. Сначала ругался линковщик, вылечил установив
и еще время от времени вылезает такая ошибка
Ошибка где-то выше должна быть. Полный выхлоп дай.
Покажи что выдает.
Зачем от рута запускал креатор? Делай теперь
Сделал. Ничего не выдает В некоторых проектах были проблемы с девайсами, система не давала работать с ними без прав. Запускал и без рута, ошибка остается
Дай полный вывод с ошибкой.
Извиняюсь, надо было сразу дать инфу из консоли сборки
Народ, я нашел ответ, кому интересно почитать или различается система, здесь: http://doc.qt.io/qt-5/linux.html , а кому некогда, для Debian/Ubuntu (apt-get):
Cпасибо за помощь
Причина в том, что Qt 5 раздулся, разжирел, у него сильно усложнился деплой и теперь он требует OpenGL там, где он нахер не нужен.
Если ты попробуешь заюзать Qt 4, то оно просто соберётся. Так как зависимости от OpenGL там нет.
Все верно, недавно ставил Qt на Lubuntu.
Из соображения — лишь бы было,
поставил, вроде, версию 5.4. Оно там не требовалось.
Источник
CMake linking error (collect2: ld returned 1 exit status)
The project structure below is a simplified example.
./CMakeLists.txt
CommBase/CMakeLists.txt
NetWork/CMakeLists.txt
MessageDispatch/CMakeLists.txt
DemoServer/CMakeLists.txt
Linking CXX executable DemoServer
I’m hoping this is a really simple lack of understanding of how CMake handles dependencies. This compiles without error, but fails during linking
NetWork is dependent on CommBase, MessageDispatch dependent on NetWork and CommBase,how can i specify in DemoServer
1 Answer 1
There are a few issues here, some more critical than others. Roughly in order of importance:
add_library allows you to define the library as either STATIC or SHARED , but not both.
target_link_libraries links the dependencies in the order they appear in the command. You should specify them from most-dependent to least. So, in your DemoServer CMakeLists.txt, it should be
However, from the docs:
Library dependencies are transitive by default. When this target is linked into another target then the libraries linked to this target will appear on the link line for the other target too.
In other words, you should have TARGET_LINK_LIBRARIES(NetWork CommBase) in NetWork (you already do), TARGET_LINK_LIBRARIES(MessageDispatch NetWork) in MessageDispatch, and just TARGET_LINK_LIBRARIES(DemoServer MessageDispatch) for the Demo.
CMAKE_BUILD_TYPE would normally be set by the user via the command line (or CMake GUI). It should probably only be set inside the CMakeLists.txt if the user hasn’t already done so, or if it’s set to an invalid value. If you set or change the value, it would be good to tell the user via a message . You probably shouldn’t be setting it in 2 different places.
aux_source_directory is not recommended as a means to gather lists of source files. The recommended way is to hard-code the file paths into your CMakeLists.txt, so if the source list changes, CMake automatically re-runs.
link_directories is rarely required, and shouldn’t contain a hard-coded absolute path.
add_dependencies is not required if you have already specified these dependencies via a target_link_libraries call.
Источник
linux assembly «collect2: ld returned 1 exit status»
I entered the source code on a web site of online coding.
But I got error below the source code.
I think I omitted «main».
Since I learned Intel assmbly, I don’t know how to fix it.
Could you help me?
Thank you for helping me in advance.
/usr/lib/gcc/i686-linux-gnu/4.6/../../../i386-linux-gnu/crt1.o: In function _start’: (.text+0x18): undefined reference to main’ collect2: ld returned 1 exit status
1 Answer 1
If you are just using GCC as a linker and don’t care about the C runtime then you can exclude it (as Jester pointed out) by passing -nostdlib to gcc . You then need to provide a _start symbol so the code would look like:
You’d assemble and link it like this:
Alternatively you can link directly with ld so you could also do this:
This would generate a 32-bit Linux executable called file
Using C Library/runtime
Although I don’t think the following is what you intended, someone may find the following information useful:
You can use GCC and have the C library available to your assembly code by renaming _START to main . The C runtime contains an entry point called _start that handles initialization and then calls a function called main . You can take advantage of the C library but main has to setup the stack frame correctly and properly clean it up and return when finished since main will be treated as a C function. The code would look something like this:
This example uses both int 0x80 system call to write standard output, and uses C printf to do the same. You can assemble and link to an executable called file with:
Источник
Can’t compile C++ in Ubuntu using GCC — Include/Library Problems (collect2: ld returned 1 exit status)
I guess I’m not linking something right?
I want to call ABC.cpp which needs XYZ.h and XYZ.cpp . All are in my current directory and I’ve tried #include as well as #include «XYZ.h» .
Running $ g++ -I. -l. ABC.cpp at the Ubuntu 10 Terminal gives me:
Here’s a summary of ABC.cpp:
I’m using GNU Compiler version g++ (Ubuntu 4.4.3-4ubuntu5) 4.4.3 .
This is my first post; I hope I included everything that someone would need to know to help me. I have actually read the «Related Questions» and the Gough article listed in one of the responses, as well as searched around for the error message. However, I still can’t figure out how it applies to my problem.
Thanks in advance!
3 Answers 3
When you run g++ -I. -l. ABC.cpp you are asking the compiler to create an executable out of ABC.cpp . But the code in this file replies on a function defined in XYZ.cpp , so the executable cannot be created due to that missing function.
You have two options (depending on what it is that you want to do). Either you give the compiler all of the source files at once so that it has all the definitions, e.g.
or, you use the -c option compile to ABC.cpp to object code (.obj on Windows, .o in Linux) which can be linked later, e.g.
Which will produce ABC.o which can be linked later with XYZ.o to produce an executable.
Edit: What is the difference between #including and linking?
Understanding this fully requires understanding exactly what happens when you compile a C++ program, which unfortunately even many people who consider themselves to be C++ programmers do not. At a high level, the compilation of a C++ program goes through three stages: preprocessing, compilation, and linking.
Preprocessing
Every line that starts with # is a preprocessor directive which is evaluated at the preprocessing stage. The #include directive is literally a copy-and-paste. If you write #include «XYZ.h» , the preprocessor replaces that line with the entire contents of XYZ.h (including recursive evaluations of #include within XYZ.h ).
The purpose of including is to make declarations visible. In order to use the function GetOneGaussianByBoxMuller , the compiler needs to know that GetOneGaussianByBoxMuller is a function, and to know what (if any) arguments it takes and what value it returns, the compiler will need to see a declaration for it. Declarations go in header files, and header files are included to make declarations visible to the compiler before the point of use.
Compiling
This is the part where the compiler runs and turns your source code into machine code. Note that machine code is not the same thing as executable code. An executable requires additional information about how to load the machine code and the data into memory, and how to bring in external dynamic libraries if necessary. That’s not done here. This is just the part where your code goes from C++ to raw machine instructions.
Unlike Java, Python, and some other languages, C++ has no concept of a «module». Instead, C++ works in terms of translation units. In nearly all cases, a translation unit corresponds to a single (non-header) source code file, e.g. ABC.cpp or XYZ.cpp . Each translation unit is compiled independently (whether you run separate -c commands for them, or you give them to the compiler all at once).
When a source file is compiled, the preprocessor runs first, and does the #include copy-pasting as well as macros and other things that the preprocessor does. The result is one long stream of C++ code consisting of the contents of the source file and everything included by it (and everything included by what it included, etc. ) This long stream of code is the translation unit.
When the translation unit is compiled, every function and every variable used must be declared. The compiler will not allow you to call a function for which there is no declaration or to use a global variable for which there is no declaration, because then it wouldn’t know the types, parameters, return values, etc, involved and could not generate sensible code. That’s why you need headers — keep in mind that at this point the compiler is not even remotely aware of the existence of any other source files; it is only considering this stream of code produced by the processing of the #include directives.
In the machine code produced by the compiler, there are no such things as variable names or function names. Everything must become a memory address. Every global variable must be translated to a memory address where it is stored, and every function must have a memory address that the flow of execution jumps to when it is called. For things that are defined (i.e. for functions, implemented) in the translation unit, the compiler can assign an address. For things that are only declared (usually as a result of included headers) and not defined, the compiler does not at this point know what the memory address should be. These functions and global variables for which the compiler has only a declaration but not a definition/implementation, are called external symbols, and they are presumed to exist in a different translation unit. For now, their memory addresses are represented with placeholders.
For example, when compiling the translation unit corresponding to ABC.cpp , it has a definition (implementation) of ABC , so it can assign an address to the function ABC and wherever in that translation unit ABC is called, it can create a jump instruction to that address. On the other hand, although its declaration is visible, GetOneGaussianByBoxMuller is not implemented in that translation unit, so its address must be represented with a placeholder.
The result of compiling a translation unit is an object file (with the .o suffix on Linux).
Linking
One of the main jobs of the linker is to resolve external symbols. That is, the linker looks through a set of object files, sees what their external symbols are, and then tries to find out what memory address should be assigned to them, replacing the placeholder.
In your case the function GetOneGaussianByBoxMuller is defined in the translation unit corresponding to XYZ.cpp , so inside XYZ.o it has been assigned a specific memory address. In the translation unit corresponding to ABC.cpp , it was only declared, so inside ABC.o , it is only a placeholder (external symbol). The linker, if given both ABC.o and XYZ.o will see that ABC.o needs an address filled in for GetOneGaussianByBoxMuller , find that address in XYZ.o , and replace the placeholder in ABC.o with it. Addresses for external symbols can also be found in libraries.
If the linker fails to find an address for GetOneGaussianByBoxMuller (as it does in your example where it is only working on ABC.o , as a result of not having passed XYZ.cpp to the compiler), it will report an unresolved external symbol error, also described as an undefined reference.
Finally, once the compiler has resolved all external symbols, it combines all of the now-placeholder-free object code, adds in all the loading information that the operating system needs, and produces an executable. Tada!
Источник
collect2: error: ld returned 1 exit status (-lcudnn)
Edit 1
I forgot to mention that I want to use the theano library.
After I reached out to the admin, the cudnn modules were provided by them. However, I am still getting the same error.
So, most probably, I have a link problem, however, I can’t find it where.
Problem
I am struggling with ld: cannot find -lcudnn .
Description
I want to use Cuda and CuDnn for my project. I am working in a cluster, Cuda is installed in the cluster already (p.s. I don’t have root permissions). So I copy the Cuda files into my local folder and install Cudnn as instructed on the official website. However, ld cannot find libcudnn.so .
What I tried
If I add the library path of libcudnn.so manually
Here is my LD_LIBRARY_PATH
ld somehow ignores LD_LIBRARY_PATH . Since I do not have the root permissions, I cannot either create a symbolic link or make changes in ldconfig . So, setting LD_LIBRARY_PATH is the only way I can fix it.
Thanks for your help.
2 Answers 2
(This could have been a comment but I don’t have enough reputation for that; I am talking only about the general linker etc usage, I don’t know about the cuda or cudnn projects and what build tools they use, etc)
If I add the library path of libcudnn.so manually
This is a link line with no object files to link and create an executable with.
This shows you got the right path into -L .
This will be fixed once you use a proper link line perhaps by incorporating the -L path you have correctly specified above into the build process e.g. the Makefile or whatever else is appropriate.
ld somehow ignores LD_LIBRARY_PATH. Since I do not have the root permissions, I cannot either create a symbolic link or make changes in ldconfig. So, setting LD_LIBRARY_PATH is the only way I can fix it.
Источник