0
- 16.01.2017 - 20:47
|
Посоветуете, пожалуйста, хорошую книгу из котором можно будет понять, как работать с линковщиком C++ и научиться отглючивать непонятные ошибки, которые вылазят на этапе линковки.
| |
1
- 21.01.2017 - 10:36
|
0-megabax > Да в принципе Страуструпа и Александреску хватить должно. Стандарт почитать не предлагаю. :) Кстати, основные ошибки это unresolved external и already defined. Причины и тех и других обычно ясны. ЗЫ: Какой величины проект, что тебя так это взволновало, что прямо книгу захотелось почитать? :) | |
2
- 21.01.2017 - 10:37
| + есть куча статей, на Хабре том же. | |
3
- 23.01.2017 - 15:04
| 1-Нас не забанить > Эта магистерская диссертация. Написал прогу на C#, затем понадобилось подключить несколько функций из OpenCV. Попдытася исользовать NuGet пакеты, вроед OpenCV подключил, но оказалось, что почему то оттуда эти функции не доступны. Сделал временный костыль: написал на C++ прогу, которая запускается из основной проги на шарпе и передает ей результат работы виде файла. Потом все-таки хотел сделать нормально, вызов из проги C# подпрограмма на C++, засунув последнюю в dll-ку. Но при компиляии такой ll-ки возникли проблемы с линковкой, и я понял, что очень мало понимаю в c++, поэтому и захотелось почитать. | |
4
- 24.01.2017 - 11:44
| 3-megabax > Решение хорошее, поддерживаю. Давай ошибки в студию! :) | |
5
- 29.01.2017 - 16:05
|
4-Нас не забанить >Ошибку выдает вот такую: "Ошибка 2 error LNK2019: ссылка на неразрешенный внешний символ _cvLoadImage в функции _MyProc D:\Самообразование\C++\DllDemo\MyLib\MyLib\MyLib.o bj 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; ** " | |
6
- 30.01.2017 - 00:06
| Судя по всему линкеру надо указать где твоя dll-ка с cvLoadImage | |
7
- 30.01.2017 - 12:34
|
6-wayerr > Похоже на то. 5-megabax > Определение (тело) функции cvLoadImage у тебя где находится? | |
8
- 30.01.2017 - 20:23
|
Определение находиться в файле c:\opencv\build\include\opencv2\imgcodecs\imgcodec s_c.h Тело функции, судя по всему, где то в библиотеке. Каталоги с либами у меня указаны в настройках "Каталоги VC++" -> "Каталоги библиотек", там стоит: C:\opencv\build\x64\vc11\lib;C:\opencv\build\x86\v c11\lib;C:\opencv\build\x86\vc12\lib;C:\opencv\bui ld\x64\vc12\lib;$(LibraryPath) И, самое интересно, этот же самый код, помещенный в консольное приложение, отлично компилиться, запускается и работает. А в случае с dll-кой почему то даже компилиться не хочет. | |
9
- 30.01.2017 - 23:11
|
8-megabax > Тогда в imgcodec s_c.h не определение, а объявление (прототип функции). Кроме каталогов с либами, нужно в на вкладке кажется Linker->Input прописать еще и конкретные либы в Additional Dependences(mylib1.lib;mylib2.lib). Почему "этот же самый код, помещенный в консольное приложение, отлично компилиться, запускается и работает." навскидку не скажу. Возможно, на самом деле в том проекте все либы корректно прописаны. | |
| Интернет-форум Краснодарского края и Краснодара |