![]() |
Посоветуйте хорошую книгу по линковщику C++ Посоветуете, пожалуйста, хорошую книгу из котором можно будет понять, как работать с линковщиком C++ и научиться отглючивать непонятные ошибки, которые вылазят на этапе линковки. |
0-megabax > Да в принципе Страуструпа и Александреску хватить должно. Стандарт почитать не предлагаю. :) Кстати, основные ошибки это unresolved external и already defined. Причины и тех и других обычно ясны. ЗЫ: Какой величины проект, что тебя так это взволновало, что прямо книгу захотелось почитать? :) |
+ есть куча статей, на Хабре том же. |
1-Нас не забанить > Эта магистерская диссертация. Написал прогу на C#, затем понадобилось подключить несколько функций из OpenCV. Попдытася исользовать NuGet пакеты, вроед OpenCV подключил, но оказалось, что почему то оттуда эти функции не доступны. Сделал временный костыль: написал на C++ прогу, которая запускается из основной проги на шарпе и передает ей результат работы виде файла. Потом все-таки хотел сделать нормально, вызов из проги C# подпрограмма на C++, засунув последнюю в dll-ку. Но при компиляии такой ll-ки возникли проблемы с линковкой, и я понял, что очень мало понимаю в c++, поэтому и захотелось почитать. |
3-megabax > Решение хорошее, поддерживаю. Давай ошибки в студию! :) |
4-Нас не забанить >Ошибку выдает вот такую: "Ошибка 2 error LNK2019: ссылка на неразрешенный внешний символ _cvLoadImage в функции _MyProc D:\Самообразование\C++\DllDemo\MyLib\MyLib\MyLib.obj MyLib" А вот программа: "// MyLib.cpp: определяет экспортированные функции для приложения DLL. // #include "stdafx.h" #include <iostream> #include <fstream> #include <cv.h> #include <highgui.h> #include <stdlib.h> #include <stdio.h> using namespace std; using namespace cv; IplImage* image = 0; IplImage* src = 0; extern "C" __declspec( dllexport ) int MyFunc(int parm1) ** return parm1*2; ** int InnerFunc1(int a) ** return a+2; ** extern "C" __declspec( dllexport ) int MyFunc1(int parm1) ** return parm1*InnerFunc1(parm1); ** extern "C" __declspec( dllexport ) int WriteToFile() ** ofstream file; file.open("D:\\1\\test_lib.txt",ios::out|ios::app); if (!file) ** return -1; ** file << "This is test C++ proc" << endl; file.close(); return 1; ** int InnerFunc2() ** /*char* filename = "d:\\3\\Dscn0116.jpg"; Mat mat;*/ // получаем картинку //image = cvLoadImage(filename,1); return 1; ** extern "C" __declspec( dllexport ) int MyProc() ** // имя картинки задаётся первым параметром char* filename = "d:\\3\\Dscn0116.jpg"; // получаем картинку image = cvLoadImage(filename,1); // клонируем картинку /*src = cvCloneImage(image); assert( src != 0 ); // окно для отображения картинки cvNamedWindow("original",CV_WINDOW_AUTOSIZE); // показываем картинку cvShowImage("original",image); // освобождаем ресурсы cvReleaseImage(& image); cvReleaseImage(&src); // удаляем окно cvDestroyWindow("original");*/ return 0; ** " |
Судя по всему линкеру надо указать где твоя dll-ка с cvLoadImage |
6-wayerr > Похоже на то. 5-megabax > Определение (тело) функции cvLoadImage у тебя где находится? |
Определение находиться в файле c:\opencv\build\include\opencv2\imgcodecs\imgcodecs_c.h Тело функции, судя по всему, где то в библиотеке. Каталоги с либами у меня указаны в настройках "Каталоги VC++" -> "Каталоги библиотек", там стоит: C:\opencv\build\x64\vc11\lib;C:\opencv\build\x86\vc11\lib;C:\opencv\build\x86\vc12\lib;C:\opencv\build\x64\vc12\lib;$(LibraryPath) И, самое интересно, этот же самый код, помещенный в консольное приложение, отлично компилиться, запускается и работает. А в случае с dll-кой почему то даже компилиться не хочет. |
8-megabax > Тогда в imgcodec s_c.h не определение, а объявление (прототип функции). Кроме каталогов с либами, нужно в на вкладке кажется Linker->Input прописать еще и конкретные либы в Additional Dependences(mylib1.lib;mylib2.lib). Почему "этот же самый код, помещенный в консольное приложение, отлично компилиться, запускается и работает." навскидку не скажу. Возможно, на самом деле в том проекте все либы корректно прописаны. |
Текущее время: 12:27. Часовой пояс GMT +3. |